{
  "cells": [
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T06:45:04.846335Z",
          "start_time": "2025-01-16T06:45:02.383978Z"
        },
        "id": "rt1eT7n-hlM6",
        "outputId": "06062584-8e9e-4b64-c11e-ba2aa06ce22c",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "source": [
        "import matplotlib as mpl\n",
        "import matplotlib.pyplot as plt\n",
        "%matplotlib inline\n",
        "import numpy as np\n",
        "import sklearn\n",
        "import pandas as pd\n",
        "import os\n",
        "import sys\n",
        "import time\n",
        "from tqdm.auto import tqdm\n",
        "import torch\n",
        "import torch.nn as nn\n",
        "import torch.nn.functional as F\n",
        "\n",
        "print(sys.version_info)\n",
        "for module in mpl, np, pd, sklearn, torch:\n",
        "    print(module.__name__, module.__version__)\n",
        "\n",
        "device = torch.device(\"cuda:0\") if torch.cuda.is_available() else torch.device(\"cpu\")\n",
        "print(device)\n"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "sys.version_info(major=3, minor=11, micro=11, releaselevel='final', serial=0)\n",
            "matplotlib 3.10.0\n",
            "numpy 1.26.4\n",
            "pandas 2.2.2\n",
            "sklearn 1.6.0\n",
            "torch 2.5.1+cu121\n",
            "cuda:0\n"
          ]
        }
      ],
      "execution_count": 1
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "7iMJf1wvhlM8"
      },
      "source": [
        "## 准备数据"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T06:45:04.904540Z",
          "start_time": "2025-01-16T06:45:04.846335Z"
        },
        "id": "NAj63TtMhlM9",
        "outputId": "42c8be51-8da7-4752-f0a9-b35dc48dfa64",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "source": [
        "from sklearn.datasets import fetch_california_housing\n",
        "\n",
        "housing = fetch_california_housing(data_home='data')\n",
        "print(housing.DESCR)\n",
        "print(housing.data.shape)\n",
        "print(housing.target.shape)"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            ".. _california_housing_dataset:\n",
            "\n",
            "California Housing dataset\n",
            "--------------------------\n",
            "\n",
            "**Data Set Characteristics:**\n",
            "\n",
            ":Number of Instances: 20640\n",
            "\n",
            ":Number of Attributes: 8 numeric, predictive attributes and the target\n",
            "\n",
            ":Attribute Information:\n",
            "    - MedInc        median income in block group\n",
            "    - HouseAge      median house age in block group\n",
            "    - AveRooms      average number of rooms per household\n",
            "    - AveBedrms     average number of bedrooms per household\n",
            "    - Population    block group population\n",
            "    - AveOccup      average number of household members\n",
            "    - Latitude      block group latitude\n",
            "    - Longitude     block group longitude\n",
            "\n",
            ":Missing Attribute Values: None\n",
            "\n",
            "This dataset was obtained from the StatLib repository.\n",
            "https://www.dcc.fc.up.pt/~ltorgo/Regression/cal_housing.html\n",
            "\n",
            "The target variable is the median house value for California districts,\n",
            "expressed in hundreds of thousands of dollars ($100,000).\n",
            "\n",
            "This dataset was derived from the 1990 U.S. census, using one row per census\n",
            "block group. A block group is the smallest geographical unit for which the U.S.\n",
            "Census Bureau publishes sample data (a block group typically has a population\n",
            "of 600 to 3,000 people).\n",
            "\n",
            "A household is a group of people residing within a home. Since the average\n",
            "number of rooms and bedrooms in this dataset are provided per household, these\n",
            "columns may take surprisingly large values for block groups with few households\n",
            "and many empty houses, such as vacation resorts.\n",
            "\n",
            "It can be downloaded/loaded using the\n",
            ":func:`sklearn.datasets.fetch_california_housing` function.\n",
            "\n",
            ".. rubric:: References\n",
            "\n",
            "- Pace, R. Kelley and Ronald Barry, Sparse Spatial Autoregressions,\n",
            "  Statistics and Probability Letters, 33 (1997) 291-297\n",
            "\n",
            "(20640, 8)\n",
            "(20640,)\n"
          ]
        }
      ],
      "execution_count": 2
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T06:45:04.907863Z",
          "start_time": "2025-01-16T06:45:04.904540Z"
        },
        "id": "l4x6yVejhlM-",
        "outputId": "9a35df31-e942-42eb-8bec-3d20328638a8",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "source": [
        "# print(housing.data[0:5])\n",
        "import pprint  #打印的格式比较好看\n",
        "\n",
        "pprint.pprint(housing.data[0:2])\n",
        "print('-'*50)\n",
        "pprint.pprint(housing.target[0:2])"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "array([[ 8.32520000e+00,  4.10000000e+01,  6.98412698e+00,\n",
            "         1.02380952e+00,  3.22000000e+02,  2.55555556e+00,\n",
            "         3.78800000e+01, -1.22230000e+02],\n",
            "       [ 8.30140000e+00,  2.10000000e+01,  6.23813708e+00,\n",
            "         9.71880492e-01,  2.40100000e+03,  2.10984183e+00,\n",
            "         3.78600000e+01, -1.22220000e+02]])\n",
            "--------------------------------------------------\n",
            "array([4.526, 3.585])\n"
          ]
        }
      ],
      "execution_count": 3
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T06:45:04.942931Z",
          "start_time": "2025-01-16T06:45:04.907863Z"
        },
        "id": "ubgzoRIAhlM-",
        "outputId": "351f0f9d-e197-4e5e-cd85-707e78b94c41",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "source": [
        "from sklearn.model_selection import train_test_split\n",
        "\n",
        "#拆分训练集和测试集，random_state是随机种子,同样的随机数种子，是为了得到同样的随机值\n",
        "x_train_all, x_test, y_train_all, y_test = train_test_split(\n",
        "    housing.data, housing.target, random_state = 7)\n",
        "x_train, x_valid, y_train, y_valid = train_test_split(\n",
        "    x_train_all, y_train_all, random_state = 11)\n",
        "# 训练集\n",
        "print(x_train.shape, y_train.shape)\n",
        "# 验证集\n",
        "print(x_valid.shape, y_valid.shape)\n",
        "# 测试集\n",
        "print(x_test.shape, y_test.shape)\n",
        "\n",
        "dataset_maps = {\n",
        "    \"train\": [x_train, y_train], #训练集\n",
        "    \"valid\": [x_valid, y_valid], #验证集\n",
        "    \"test\": [x_test, y_test], #测试集\n",
        "} #把3个数据集都放到字典中\n"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "(11610, 8) (11610,)\n",
            "(3870, 8) (3870,)\n",
            "(5160, 8) (5160,)\n"
          ]
        }
      ],
      "execution_count": 4
    },
    {
      "cell_type": "code",
      "source": [
        "type(x_train)"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T06:45:04.946957Z",
          "start_time": "2025-01-16T06:45:04.943934Z"
        },
        "id": "QS4T8EOwhlM_",
        "outputId": "3b58ca1d-dd36-4b60-db91-d2da055f659f",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "numpy.ndarray"
            ]
          },
          "metadata": {},
          "execution_count": 5
        }
      ],
      "execution_count": 5
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T06:45:04.952973Z",
          "start_time": "2025-01-16T06:45:04.946957Z"
        },
        "id": "4FSIvC1QhlNA",
        "outputId": "1608e8ac-b10f-4fd8-a53c-b8483307c021",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 79
        }
      },
      "source": [
        "from sklearn.preprocessing import StandardScaler\n",
        "\n",
        "\n",
        "\n",
        "scaler = StandardScaler() #标准化\n",
        "scaler.fit(x_train) #fit和fit_transform的区别，fit是计算均值和方差，fit_transform是先fit，然后transform"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "StandardScaler()"
            ],
            "text/html": [
              "<style>#sk-container-id-1 {\n",
              "  /* Definition of color scheme common for light and dark mode */\n",
              "  --sklearn-color-text: #000;\n",
              "  --sklearn-color-text-muted: #666;\n",
              "  --sklearn-color-line: gray;\n",
              "  /* Definition of color scheme for unfitted estimators */\n",
              "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
              "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
              "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
              "  --sklearn-color-unfitted-level-3: chocolate;\n",
              "  /* Definition of color scheme for fitted estimators */\n",
              "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
              "  --sklearn-color-fitted-level-1: #d4ebff;\n",
              "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
              "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
              "\n",
              "  /* Specific color for light theme */\n",
              "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
              "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
              "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
              "  --sklearn-color-icon: #696969;\n",
              "\n",
              "  @media (prefers-color-scheme: dark) {\n",
              "    /* Redefinition of color scheme for dark theme */\n",
              "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
              "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
              "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
              "    --sklearn-color-icon: #878787;\n",
              "  }\n",
              "}\n",
              "\n",
              "#sk-container-id-1 {\n",
              "  color: var(--sklearn-color-text);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 pre {\n",
              "  padding: 0;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 input.sk-hidden--visually {\n",
              "  border: 0;\n",
              "  clip: rect(1px 1px 1px 1px);\n",
              "  clip: rect(1px, 1px, 1px, 1px);\n",
              "  height: 1px;\n",
              "  margin: -1px;\n",
              "  overflow: hidden;\n",
              "  padding: 0;\n",
              "  position: absolute;\n",
              "  width: 1px;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-dashed-wrapped {\n",
              "  border: 1px dashed var(--sklearn-color-line);\n",
              "  margin: 0 0.4em 0.5em 0.4em;\n",
              "  box-sizing: border-box;\n",
              "  padding-bottom: 0.4em;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-container {\n",
              "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
              "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
              "     so we also need the `!important` here to be able to override the\n",
              "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
              "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
              "  display: inline-block !important;\n",
              "  position: relative;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-text-repr-fallback {\n",
              "  display: none;\n",
              "}\n",
              "\n",
              "div.sk-parallel-item,\n",
              "div.sk-serial,\n",
              "div.sk-item {\n",
              "  /* draw centered vertical line to link estimators */\n",
              "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
              "  background-size: 2px 100%;\n",
              "  background-repeat: no-repeat;\n",
              "  background-position: center center;\n",
              "}\n",
              "\n",
              "/* Parallel-specific style estimator block */\n",
              "\n",
              "#sk-container-id-1 div.sk-parallel-item::after {\n",
              "  content: \"\";\n",
              "  width: 100%;\n",
              "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
              "  flex-grow: 1;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-parallel {\n",
              "  display: flex;\n",
              "  align-items: stretch;\n",
              "  justify-content: center;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "  position: relative;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-parallel-item {\n",
              "  display: flex;\n",
              "  flex-direction: column;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-parallel-item:first-child::after {\n",
              "  align-self: flex-end;\n",
              "  width: 50%;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-parallel-item:last-child::after {\n",
              "  align-self: flex-start;\n",
              "  width: 50%;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-parallel-item:only-child::after {\n",
              "  width: 0;\n",
              "}\n",
              "\n",
              "/* Serial-specific style estimator block */\n",
              "\n",
              "#sk-container-id-1 div.sk-serial {\n",
              "  display: flex;\n",
              "  flex-direction: column;\n",
              "  align-items: center;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "  padding-right: 1em;\n",
              "  padding-left: 1em;\n",
              "}\n",
              "\n",
              "\n",
              "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
              "clickable and can be expanded/collapsed.\n",
              "- Pipeline and ColumnTransformer use this feature and define the default style\n",
              "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
              "*/\n",
              "\n",
              "/* Pipeline and ColumnTransformer style (default) */\n",
              "\n",
              "#sk-container-id-1 div.sk-toggleable {\n",
              "  /* Default theme specific background. It is overwritten whether we have a\n",
              "  specific estimator or a Pipeline/ColumnTransformer */\n",
              "  background-color: var(--sklearn-color-background);\n",
              "}\n",
              "\n",
              "/* Toggleable label */\n",
              "#sk-container-id-1 label.sk-toggleable__label {\n",
              "  cursor: pointer;\n",
              "  display: flex;\n",
              "  width: 100%;\n",
              "  margin-bottom: 0;\n",
              "  padding: 0.5em;\n",
              "  box-sizing: border-box;\n",
              "  text-align: center;\n",
              "  align-items: start;\n",
              "  justify-content: space-between;\n",
              "  gap: 0.5em;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 label.sk-toggleable__label .caption {\n",
              "  font-size: 0.6rem;\n",
              "  font-weight: lighter;\n",
              "  color: var(--sklearn-color-text-muted);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 label.sk-toggleable__label-arrow:before {\n",
              "  /* Arrow on the left of the label */\n",
              "  content: \"▸\";\n",
              "  float: left;\n",
              "  margin-right: 0.25em;\n",
              "  color: var(--sklearn-color-icon);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {\n",
              "  color: var(--sklearn-color-text);\n",
              "}\n",
              "\n",
              "/* Toggleable content - dropdown */\n",
              "\n",
              "#sk-container-id-1 div.sk-toggleable__content {\n",
              "  max-height: 0;\n",
              "  max-width: 0;\n",
              "  overflow: hidden;\n",
              "  text-align: left;\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-toggleable__content.fitted {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-toggleable__content pre {\n",
              "  margin: 0.2em;\n",
              "  border-radius: 0.25em;\n",
              "  color: var(--sklearn-color-text);\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-toggleable__content.fitted pre {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
              "  /* Expand drop-down */\n",
              "  max-height: 200px;\n",
              "  max-width: 100%;\n",
              "  overflow: auto;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
              "  content: \"▾\";\n",
              "}\n",
              "\n",
              "/* Pipeline/ColumnTransformer-specific style */\n",
              "\n",
              "#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
              "  color: var(--sklearn-color-text);\n",
              "  background-color: var(--sklearn-color-unfitted-level-2);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
              "  background-color: var(--sklearn-color-fitted-level-2);\n",
              "}\n",
              "\n",
              "/* Estimator-specific style */\n",
              "\n",
              "/* Colorize estimator box */\n",
              "#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-2);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-2);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-label label.sk-toggleable__label,\n",
              "#sk-container-id-1 div.sk-label label {\n",
              "  /* The background is the default theme color */\n",
              "  color: var(--sklearn-color-text-on-default-background);\n",
              "}\n",
              "\n",
              "/* On hover, darken the color of the background */\n",
              "#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {\n",
              "  color: var(--sklearn-color-text);\n",
              "  background-color: var(--sklearn-color-unfitted-level-2);\n",
              "}\n",
              "\n",
              "/* Label box, darken color on hover, fitted */\n",
              "#sk-container-id-1 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
              "  color: var(--sklearn-color-text);\n",
              "  background-color: var(--sklearn-color-fitted-level-2);\n",
              "}\n",
              "\n",
              "/* Estimator label */\n",
              "\n",
              "#sk-container-id-1 div.sk-label label {\n",
              "  font-family: monospace;\n",
              "  font-weight: bold;\n",
              "  display: inline-block;\n",
              "  line-height: 1.2em;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-label-container {\n",
              "  text-align: center;\n",
              "}\n",
              "\n",
              "/* Estimator-specific */\n",
              "#sk-container-id-1 div.sk-estimator {\n",
              "  font-family: monospace;\n",
              "  border: 1px dotted var(--sklearn-color-border-box);\n",
              "  border-radius: 0.25em;\n",
              "  box-sizing: border-box;\n",
              "  margin-bottom: 0.5em;\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-estimator.fitted {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-0);\n",
              "}\n",
              "\n",
              "/* on hover */\n",
              "#sk-container-id-1 div.sk-estimator:hover {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-2);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-estimator.fitted:hover {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-2);\n",
              "}\n",
              "\n",
              "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
              "\n",
              "/* Common style for \"i\" and \"?\" */\n",
              "\n",
              ".sk-estimator-doc-link,\n",
              "a:link.sk-estimator-doc-link,\n",
              "a:visited.sk-estimator-doc-link {\n",
              "  float: right;\n",
              "  font-size: smaller;\n",
              "  line-height: 1em;\n",
              "  font-family: monospace;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "  border-radius: 1em;\n",
              "  height: 1em;\n",
              "  width: 1em;\n",
              "  text-decoration: none !important;\n",
              "  margin-left: 0.5em;\n",
              "  text-align: center;\n",
              "  /* unfitted */\n",
              "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
              "  color: var(--sklearn-color-unfitted-level-1);\n",
              "}\n",
              "\n",
              ".sk-estimator-doc-link.fitted,\n",
              "a:link.sk-estimator-doc-link.fitted,\n",
              "a:visited.sk-estimator-doc-link.fitted {\n",
              "  /* fitted */\n",
              "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
              "  color: var(--sklearn-color-fitted-level-1);\n",
              "}\n",
              "\n",
              "/* On hover */\n",
              "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
              ".sk-estimator-doc-link:hover,\n",
              "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
              ".sk-estimator-doc-link:hover {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-3);\n",
              "  color: var(--sklearn-color-background);\n",
              "  text-decoration: none;\n",
              "}\n",
              "\n",
              "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
              ".sk-estimator-doc-link.fitted:hover,\n",
              "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
              ".sk-estimator-doc-link.fitted:hover {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-3);\n",
              "  color: var(--sklearn-color-background);\n",
              "  text-decoration: none;\n",
              "}\n",
              "\n",
              "/* Span, style for the box shown on hovering the info icon */\n",
              ".sk-estimator-doc-link span {\n",
              "  display: none;\n",
              "  z-index: 9999;\n",
              "  position: relative;\n",
              "  font-weight: normal;\n",
              "  right: .2ex;\n",
              "  padding: .5ex;\n",
              "  margin: .5ex;\n",
              "  width: min-content;\n",
              "  min-width: 20ex;\n",
              "  max-width: 50ex;\n",
              "  color: var(--sklearn-color-text);\n",
              "  box-shadow: 2pt 2pt 4pt #999;\n",
              "  /* unfitted */\n",
              "  background: var(--sklearn-color-unfitted-level-0);\n",
              "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
              "}\n",
              "\n",
              ".sk-estimator-doc-link.fitted span {\n",
              "  /* fitted */\n",
              "  background: var(--sklearn-color-fitted-level-0);\n",
              "  border: var(--sklearn-color-fitted-level-3);\n",
              "}\n",
              "\n",
              ".sk-estimator-doc-link:hover span {\n",
              "  display: block;\n",
              "}\n",
              "\n",
              "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
              "\n",
              "#sk-container-id-1 a.estimator_doc_link {\n",
              "  float: right;\n",
              "  font-size: 1rem;\n",
              "  line-height: 1em;\n",
              "  font-family: monospace;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "  border-radius: 1rem;\n",
              "  height: 1rem;\n",
              "  width: 1rem;\n",
              "  text-decoration: none;\n",
              "  /* unfitted */\n",
              "  color: var(--sklearn-color-unfitted-level-1);\n",
              "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 a.estimator_doc_link.fitted {\n",
              "  /* fitted */\n",
              "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
              "  color: var(--sklearn-color-fitted-level-1);\n",
              "}\n",
              "\n",
              "/* On hover */\n",
              "#sk-container-id-1 a.estimator_doc_link:hover {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-3);\n",
              "  color: var(--sklearn-color-background);\n",
              "  text-decoration: none;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 a.estimator_doc_link.fitted:hover {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-3);\n",
              "}\n",
              "</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>StandardScaler()</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>StandardScaler</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.preprocessing.StandardScaler.html\">?<span>Documentation for StandardScaler</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></div></label><div class=\"sk-toggleable__content fitted\"><pre>StandardScaler()</pre></div> </div></div></div></div>"
            ]
          },
          "metadata": {},
          "execution_count": 6
        }
      ],
      "execution_count": 6
    },
    {
      "cell_type": "code",
      "source": [
        "np.array(1).shape"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T06:45:04.956326Z",
          "start_time": "2025-01-16T06:45:04.952973Z"
        },
        "id": "LlSFloiNhlNA",
        "outputId": "53459519-776d-423e-d025-1a656daa1542",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "()"
            ]
          },
          "metadata": {},
          "execution_count": 7
        }
      ],
      "execution_count": 7
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "c1HGGDCChlNB"
      },
      "source": [
        "### 构建数据集"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T06:45:04.963803Z",
          "start_time": "2025-01-16T06:45:04.956326Z"
        },
        "id": "Is3BcQQDhlNB"
      },
      "source": [
        "#构建私有数据集，就需要用如下方式\n",
        "from torch.utils.data import Dataset\n",
        "\n",
        "class HousingDataset(Dataset):\n",
        "    def __init__(self, mode='train'):\n",
        "        self.x, self.y = dataset_maps[mode] #x,y都是ndarray类型\n",
        "        self.x = torch.from_numpy(scaler.transform(self.x)).float() #from_numpy将NumPy数组转换成PyTorch张量\n",
        "        self.y = torch.from_numpy(self.y).float().reshape(-1, 1) #处理为多行1列的tensor类型,因为__getitem__切片时需要\n",
        "\n",
        "    def __len__(self): #必须写\n",
        "        return len(self.x) #返回数据集的长度,0维的size\n",
        "\n",
        "    def __getitem__(self, idx): #idx是索引，返回的是数据和标签，这里是一个样本\n",
        "        return self.x[idx], self.y[idx]\n",
        "\n",
        "#train_ds是dataset类型的数据，与前面例子的FashionMNIST类型一致\n",
        "train_ds = HousingDataset(\"train\")\n",
        "valid_ds = HousingDataset(\"valid\")\n",
        "test_ds = HousingDataset(\"test\")"
      ],
      "outputs": [],
      "execution_count": 8
    },
    {
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T06:45:04.966801Z",
          "start_time": "2025-01-16T06:45:04.963803Z"
        },
        "id": "C-KI-GPMhlNB",
        "outputId": "698be398-20d5-475e-da6a-83f177613100",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 185
        }
      },
      "cell_type": "code",
      "source": [
        "type(train_ds)"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "__main__.HousingDataset"
            ],
            "text/html": [
              "<div style=\"max-width:800px; border: 1px solid var(--colab-border-color);\"><style>\n",
              "      pre.function-repr-contents {\n",
              "        overflow-x: auto;\n",
              "        padding: 8px 12px;\n",
              "        max-height: 500px;\n",
              "      }\n",
              "\n",
              "      pre.function-repr-contents.function-repr-contents-collapsed {\n",
              "        cursor: pointer;\n",
              "        max-height: 100px;\n",
              "      }\n",
              "    </style>\n",
              "    <pre style=\"white-space: initial; background:\n",
              "         var(--colab-secondary-surface-color); padding: 8px 12px;\n",
              "         border-bottom: 1px solid var(--colab-border-color);\"><b>HousingDataset</b><br/>def __init__(mode=&#x27;train&#x27;)</pre><pre class=\"function-repr-contents function-repr-contents-collapsed\" style=\"\"><a class=\"filepath\" style=\"display:none\" href=\"#\"></a>An abstract class representing a :class:`Dataset`.\n",
              "\n",
              "All datasets that represent a map from keys to data samples should subclass\n",
              "it. All subclasses should overwrite :meth:`__getitem__`, supporting fetching a\n",
              "data sample for a given key. Subclasses could also optionally overwrite\n",
              ":meth:`__len__`, which is expected to return the size of the dataset by many\n",
              ":class:`~torch.utils.data.Sampler` implementations and the default options\n",
              "of :class:`~torch.utils.data.DataLoader`. Subclasses could also\n",
              "optionally implement :meth:`__getitems__`, for speedup batched samples\n",
              "loading. This method accepts list of indices of samples of batch and returns\n",
              "list of samples.\n",
              "\n",
              ".. note::\n",
              "  :class:`~torch.utils.data.DataLoader` by default constructs an index\n",
              "  sampler that yields integral indices.  To make it work with a map-style\n",
              "  dataset with non-integral indices/keys, a custom sampler must be provided.</pre></div>"
            ]
          },
          "metadata": {},
          "execution_count": 9
        }
      ],
      "execution_count": 9
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T06:45:04.972403Z",
          "start_time": "2025-01-16T06:45:04.966801Z"
        },
        "id": "gz_PnMnhhlNC",
        "outputId": "a8650405-8d2b-4a79-da7b-ca1b60e41152",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "source": [
        "train_ds[1]"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(tensor([-0.2981,  0.3523, -0.1092, -0.2506, -0.0341, -0.0060,  1.0806, -1.0611]),\n",
              " tensor([1.5140]))"
            ]
          },
          "metadata": {},
          "execution_count": 10
        }
      ],
      "execution_count": 10
    },
    {
      "cell_type": "code",
      "source": [
        "train_ds[0][0]"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T06:45:04.975745Z",
          "start_time": "2025-01-16T06:45:04.972403Z"
        },
        "id": "4bGHXwI7hlNC",
        "outputId": "5d1cf74c-fdad-4619-8137-dfc3f5a045e9",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "tensor([ 0.8015,  0.2722, -0.1162, -0.2023, -0.5431, -0.0210, -0.5898, -0.0824])"
            ]
          },
          "metadata": {},
          "execution_count": 11
        }
      ],
      "execution_count": 11
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "AGM_IgxBhlNC"
      },
      "source": [
        "### DataLoader"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T06:45:04.979156Z",
          "start_time": "2025-01-16T06:45:04.976749Z"
        },
        "id": "q0jDsbbShlNC"
      },
      "source": [
        "from torch.utils.data import DataLoader\n",
        "\n",
        "#放到DataLoader中的train_ds, valid_ds, test_ds都是dataset类型的数据\n",
        "batch_size = 16 #batch_size是可以调的超参数\n",
        "train_loader = DataLoader(train_ds, batch_size=batch_size, shuffle=True)\n",
        "val_loader = DataLoader(valid_ds, batch_size=batch_size, shuffle=False)\n",
        "test_loader = DataLoader(test_ds, batch_size=batch_size, shuffle=False)"
      ],
      "outputs": [],
      "execution_count": 12
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "RWweK1CXhlND"
      },
      "source": [
        "## 定义模型"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T06:45:04.981959Z",
          "start_time": "2025-01-16T06:45:04.979156Z"
        },
        "id": "rNjmMEFIhlND"
      },
      "source": [
        "#回归模型我们只需要1个数\n",
        "\n",
        "class NeuralNetwork(nn.Module):\n",
        "    def __init__(self, input_dim=8):#输入维度8，输出1\n",
        "        super().__init__()\n",
        "        self.linear_relu_stack = nn.Sequential(\n",
        "            nn.Linear(input_dim, 30),\n",
        "            nn.ReLU(),\n",
        "            nn.Linear(30, 1)\n",
        "            )\n",
        "\n",
        "    def forward(self, x):\n",
        "        # x.shape [batch size, 8]\n",
        "        logits = self.linear_relu_stack(x)\n",
        "        # logits.shape [batch size, 1]\n",
        "        return logits"
      ],
      "outputs": [],
      "execution_count": 13
    },
    {
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T06:45:04.985779Z",
          "start_time": "2025-01-16T06:45:04.982963Z"
        },
        "id": "1zc4fer4hlND",
        "outputId": "d066857c-4372-4840-f7d8-0c8299cb6e6b"
      },
      "cell_type": "code",
      "source": [
        "8*30+30+30*1+1"
      ],
      "outputs": [
        {
          "data": {
            "text/plain": [
              "301"
            ]
          },
          "execution_count": 14,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "execution_count": null
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T06:45:04.988940Z",
          "start_time": "2025-01-16T06:45:04.985779Z"
        },
        "id": "ihU0MeulhlND"
      },
      "source": [
        "class EarlyStopCallback:#防止过拟合\n",
        "    def __init__(self, patience=5, min_delta=0.01):\n",
        "        \"\"\"\n",
        "\n",
        "        Args:\n",
        "            patience (int, optional): Number of epochs with no improvement after which training will be stopped.. Defaults to 5.\n",
        "            min_delta (float, optional): Minimum change in the monitored quantity to qualify as an improvement, i.e. an absolute\n",
        "                change of less than min_delta, will count as no improvement. Defaults to 0.01.\n",
        "        \"\"\"\n",
        "        self.patience = patience\n",
        "        self.min_delta = min_delta\n",
        "        self.best_metric = -1\n",
        "        self.counter = 0\n",
        "\n",
        "    def __call__(self, metric):\n",
        "        if metric >= self.best_metric + self.min_delta:\n",
        "            # update best metric\n",
        "            self.best_metric = metric\n",
        "            # reset counter\n",
        "            self.counter = 0\n",
        "        else:\n",
        "            self.counter += 1\n",
        "\n",
        "    @property\n",
        "    def early_stop(self):\n",
        "        return self.counter >= self.patience\n"
      ],
      "outputs": [],
      "execution_count": 14
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T06:45:04.991952Z",
          "start_time": "2025-01-16T06:45:04.988940Z"
        },
        "id": "gkn05ut4hlNE"
      },
      "source": [
        "from sklearn.metrics import accuracy_score#计算平均损失\n",
        "\n",
        "@torch.no_grad()#禁用梯度计算\n",
        "def evaluating(model, dataloader, loss_fct):\n",
        "    loss_list = []\n",
        "    for datas, labels in dataloader:\n",
        "        datas = datas.to(device)\n",
        "        labels = labels.to(device)\n",
        "        # 前向计算\n",
        "        logits = model(datas)\n",
        "        loss = loss_fct(logits, labels)         # 验证集损失\n",
        "        loss_list.append(loss.item())\n",
        "\n",
        "    return np.mean(loss_list)\n"
      ],
      "outputs": [],
      "execution_count": 15
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T06:46:35.958615Z",
          "start_time": "2025-01-16T06:45:47.596197Z"
        },
        "id": "woqhfQ7bhlNE",
        "outputId": "6779ac3f-7e9e-4985-af31-e3217bf73a52",
        "colab": {
          "referenced_widgets": [
            "1cc70e1e2cff4971b397d87c74111144",
            "54992dbc580c478395276a5a774b7bd7",
            "623f68e3b82c45f8a7d2d275800ad367",
            "98c9febd679641419883ce41c938a7c3",
            "982e7a263dc3402cb74a47490c922e67",
            "8b045dadfe214a15a403959f80642177",
            "1057d03ef04147ed81c8cd67ef6825d1",
            "77b2cc68843c4b9cbe8e7b0c011ae7f2",
            "53eb3bbbe39949cfaf3b4dfbd077fd3e",
            "3c5f86b891ea46d8b5b951fa64dd255a",
            "6ed66a4d2e994f9281e2b51b0bd15554"
          ],
          "base_uri": "https://localhost:8080/",
          "height": 49
        }
      },
      "source": [
        "# 训练\n",
        "def training(\n",
        "    model,\n",
        "    train_loader,\n",
        "    val_loader,\n",
        "    epoch,\n",
        "    loss_fct,\n",
        "    optimizer,\n",
        "    early_stop_callback=None,\n",
        "    eval_step=500,\n",
        "    ):\n",
        "    record_dict = {\n",
        "        \"train\": [],\n",
        "        \"val\": []\n",
        "    }\n",
        "\n",
        "    global_step = 0\n",
        "    model.train()\n",
        "    with tqdm(total=epoch * len(train_loader)) as pbar:\n",
        "        for epoch_id in range(epoch):\n",
        "            # training\n",
        "            for datas, labels in train_loader:#11610/16=726\n",
        "                datas = datas.to(device)\n",
        "                labels = labels.to(device)\n",
        "                # 梯度清空\n",
        "                optimizer.zero_grad()\n",
        "                # 模型前向计算\n",
        "                logits = model(datas) #得到预测值\n",
        "                # 计算损失\n",
        "                loss = loss_fct(logits, labels)\n",
        "                # 梯度回传\n",
        "                loss.backward()\n",
        "                # 调整优化器，包括学习率的变动等\n",
        "                optimizer.step()\n",
        "\n",
        "                loss = loss.cpu().item() #转为cpu类型，item()是取值\n",
        "                # record\n",
        "\n",
        "                record_dict[\"train\"].append({\n",
        "                    \"loss\": loss, \"step\": global_step\n",
        "                })\n",
        "\n",
        "                # evaluating\n",
        "                if global_step % eval_step == 0:\n",
        "                    model.eval()\n",
        "                    val_loss = evaluating(model, val_loader, loss_fct)\n",
        "                    record_dict[\"val\"].append({\n",
        "                        \"loss\": val_loss, \"step\": global_step\n",
        "                    })\n",
        "                    model.train()\n",
        "\n",
        "                    # 早停 Early Stop\n",
        "                    if early_stop_callback is not None:\n",
        "                        early_stop_callback(-val_loss) #根据验证集的损失来实现早停\n",
        "                        if early_stop_callback.early_stop:\n",
        "                            print(f\"Early stop at epoch {epoch_id} / global_step {global_step}\")\n",
        "                            return record_dict\n",
        "\n",
        "                # udate step\n",
        "                global_step += 1\n",
        "                pbar.update(1)\n",
        "                pbar.set_postfix({\"epoch\": epoch_id})\n",
        "\n",
        "    return record_dict\n",
        "\n",
        "\n",
        "epoch = 100\n",
        "\n",
        "model = NeuralNetwork()\n",
        "\n",
        "# 1. 定义损失函数 采用MSE损失,均方误差\n",
        "loss_fct = nn.MSELoss()\n",
        "# 2. 定义优化器 采用SGD\n",
        "# Optimizers specified in the torch.optim package\n",
        "optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)\n",
        "\n",
        "# 3. early stop\n",
        "early_stop_callback = EarlyStopCallback(patience=10, min_delta=1e-3)\n",
        "\n",
        "model = model.to(device)\n",
        "record = training(\n",
        "    model,\n",
        "    train_loader,\n",
        "    val_loader,\n",
        "    epoch,\n",
        "    loss_fct,\n",
        "    optimizer,\n",
        "    early_stop_callback=early_stop_callback,\n",
        "    eval_step=len(train_loader)\n",
        "    )"
      ],
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "  0%|          | 0/72600 [00:00<?, ?it/s]"
            ],
            "application/vnd.jupyter.widget-view+json": {
              "version_major": 2,
              "version_minor": 0,
              "model_id": "1cc70e1e2cff4971b397d87c74111144"
            }
          },
          "metadata": {}
        }
      ],
      "execution_count": null
    },
    {
      "cell_type": "code",
      "execution_count": 17,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "{'train': [{'loss': 7.421160697937012, 'step': 0},\n",
              "  {'loss': 5.3622589111328125, 'step': 1},\n",
              "  {'loss': 8.251357078552246, 'step': 2},\n",
              "  {'loss': 3.9710187911987305, 'step': 3},\n",
              "  {'loss': 6.520208358764648, 'step': 4},\n",
              "  {'loss': 8.0484619140625, 'step': 5},\n",
              "  {'loss': 6.1445536613464355, 'step': 6},\n",
              "  {'loss': 3.130344867706299, 'step': 7},\n",
              "  {'loss': 3.2790441513061523, 'step': 8},\n",
              "  {'loss': 2.2022125720977783, 'step': 9},\n",
              "  {'loss': 2.64841365814209, 'step': 10},\n",
              "  {'loss': 3.8265204429626465, 'step': 11},\n",
              "  {'loss': 4.58936071395874, 'step': 12},\n",
              "  {'loss': 2.5960536003112793, 'step': 13},\n",
              "  {'loss': 3.1682186126708984, 'step': 14},\n",
              "  {'loss': 5.1507391929626465, 'step': 15},\n",
              "  {'loss': 4.220935344696045, 'step': 16},\n",
              "  {'loss': 2.7870564460754395, 'step': 17},\n",
              "  {'loss': 1.2660578489303589, 'step': 18},\n",
              "  {'loss': 1.3530471324920654, 'step': 19},\n",
              "  {'loss': 1.7676085233688354, 'step': 20},\n",
              "  {'loss': 2.782829523086548, 'step': 21},\n",
              "  {'loss': 1.4525461196899414, 'step': 22},\n",
              "  {'loss': 1.017329216003418, 'step': 23},\n",
              "  {'loss': 1.0006927251815796, 'step': 24},\n",
              "  {'loss': 0.5386710166931152, 'step': 25},\n",
              "  {'loss': 0.6393048763275146, 'step': 26},\n",
              "  {'loss': 1.2255988121032715, 'step': 27},\n",
              "  {'loss': 0.6386684775352478, 'step': 28},\n",
              "  {'loss': 1.1688745021820068, 'step': 29},\n",
              "  {'loss': 0.671970009803772, 'step': 30},\n",
              "  {'loss': 0.4964616894721985, 'step': 31},\n",
              "  {'loss': 1.6366548538208008, 'step': 32},\n",
              "  {'loss': 1.7521939277648926, 'step': 33},\n",
              "  {'loss': 1.2702306509017944, 'step': 34},\n",
              "  {'loss': 0.2795290946960449, 'step': 35},\n",
              "  {'loss': 1.2867921590805054, 'step': 36},\n",
              "  {'loss': 0.8895583152770996, 'step': 37},\n",
              "  {'loss': 1.151383638381958, 'step': 38},\n",
              "  {'loss': 0.8093899488449097, 'step': 39},\n",
              "  {'loss': 1.8614383935928345, 'step': 40},\n",
              "  {'loss': 0.37413546442985535, 'step': 41},\n",
              "  {'loss': 0.8290836811065674, 'step': 42},\n",
              "  {'loss': 0.8792833089828491, 'step': 43},\n",
              "  {'loss': 0.9019085168838501, 'step': 44},\n",
              "  {'loss': 1.1597299575805664, 'step': 45},\n",
              "  {'loss': 0.7709068059921265, 'step': 46},\n",
              "  {'loss': 0.9687535762786865, 'step': 47},\n",
              "  {'loss': 0.41475746035575867, 'step': 48},\n",
              "  {'loss': 0.9902848601341248, 'step': 49},\n",
              "  {'loss': 0.4137132465839386, 'step': 50},\n",
              "  {'loss': 0.22453460097312927, 'step': 51},\n",
              "  {'loss': 0.5311639904975891, 'step': 52},\n",
              "  {'loss': 0.39331290125846863, 'step': 53},\n",
              "  {'loss': 1.1765100955963135, 'step': 54},\n",
              "  {'loss': 0.28162533044815063, 'step': 55},\n",
              "  {'loss': 0.8071354627609253, 'step': 56},\n",
              "  {'loss': 0.7085248827934265, 'step': 57},\n",
              "  {'loss': 0.48798853158950806, 'step': 58},\n",
              "  {'loss': 0.5397887229919434, 'step': 59},\n",
              "  {'loss': 0.7223278284072876, 'step': 60},\n",
              "  {'loss': 1.383667230606079, 'step': 61},\n",
              "  {'loss': 0.6290404200553894, 'step': 62},\n",
              "  {'loss': 0.7340845465660095, 'step': 63},\n",
              "  {'loss': 0.42879506945610046, 'step': 64},\n",
              "  {'loss': 0.5665035843849182, 'step': 65},\n",
              "  {'loss': 0.4564167857170105, 'step': 66},\n",
              "  {'loss': 0.6222304105758667, 'step': 67},\n",
              "  {'loss': 0.29111164808273315, 'step': 68},\n",
              "  {'loss': 0.6552419662475586, 'step': 69},\n",
              "  {'loss': 1.2312935590744019, 'step': 70},\n",
              "  {'loss': 0.6789315938949585, 'step': 71},\n",
              "  {'loss': 0.46236279606819153, 'step': 72},\n",
              "  {'loss': 0.6696637272834778, 'step': 73},\n",
              "  {'loss': 0.7345907688140869, 'step': 74},\n",
              "  {'loss': 0.38932499289512634, 'step': 75},\n",
              "  {'loss': 0.4580570161342621, 'step': 76},\n",
              "  {'loss': 2.6682841777801514, 'step': 77},\n",
              "  {'loss': 0.3392868936061859, 'step': 78},\n",
              "  {'loss': 1.1052656173706055, 'step': 79},\n",
              "  {'loss': 1.020508050918579, 'step': 80},\n",
              "  {'loss': 0.7697601914405823, 'step': 81},\n",
              "  {'loss': 0.23819056153297424, 'step': 82},\n",
              "  {'loss': 0.6557919383049011, 'step': 83},\n",
              "  {'loss': 0.5272067189216614, 'step': 84},\n",
              "  {'loss': 1.2177255153656006, 'step': 85},\n",
              "  {'loss': 0.9393172264099121, 'step': 86},\n",
              "  {'loss': 0.7221350073814392, 'step': 87},\n",
              "  {'loss': 0.8542282581329346, 'step': 88},\n",
              "  {'loss': 0.652640163898468, 'step': 89},\n",
              "  {'loss': 2.5272414684295654, 'step': 90},\n",
              "  {'loss': 0.5266749858856201, 'step': 91},\n",
              "  {'loss': 1.442515254020691, 'step': 92},\n",
              "  {'loss': 0.202192023396492, 'step': 93},\n",
              "  {'loss': 1.2696791887283325, 'step': 94},\n",
              "  {'loss': 0.6962264776229858, 'step': 95},\n",
              "  {'loss': 0.4177231788635254, 'step': 96},\n",
              "  {'loss': 0.4139920771121979, 'step': 97},\n",
              "  {'loss': 0.4730041027069092, 'step': 98},\n",
              "  {'loss': 0.6651686429977417, 'step': 99},\n",
              "  {'loss': 0.32297539710998535, 'step': 100},\n",
              "  {'loss': 0.8451321721076965, 'step': 101},\n",
              "  {'loss': 0.6453433036804199, 'step': 102},\n",
              "  {'loss': 2.4649410247802734, 'step': 103},\n",
              "  {'loss': 0.5561028718948364, 'step': 104},\n",
              "  {'loss': 0.45463669300079346, 'step': 105},\n",
              "  {'loss': 0.8892134428024292, 'step': 106},\n",
              "  {'loss': 0.2064647227525711, 'step': 107},\n",
              "  {'loss': 1.1277966499328613, 'step': 108},\n",
              "  {'loss': 0.5866044163703918, 'step': 109},\n",
              "  {'loss': 0.721274733543396, 'step': 110},\n",
              "  {'loss': 0.5591223835945129, 'step': 111},\n",
              "  {'loss': 1.0273869037628174, 'step': 112},\n",
              "  {'loss': 0.5780043601989746, 'step': 113},\n",
              "  {'loss': 0.738262414932251, 'step': 114},\n",
              "  {'loss': 0.23316380381584167, 'step': 115},\n",
              "  {'loss': 0.21656814217567444, 'step': 116},\n",
              "  {'loss': 1.0245999097824097, 'step': 117},\n",
              "  {'loss': 0.8346558809280396, 'step': 118},\n",
              "  {'loss': 0.7167510986328125, 'step': 119},\n",
              "  {'loss': 0.8097047805786133, 'step': 120},\n",
              "  {'loss': 0.23904159665107727, 'step': 121},\n",
              "  {'loss': 1.1093488931655884, 'step': 122},\n",
              "  {'loss': 0.6152557134628296, 'step': 123},\n",
              "  {'loss': 0.6261725425720215, 'step': 124},\n",
              "  {'loss': 0.6561639904975891, 'step': 125},\n",
              "  {'loss': 0.8894104957580566, 'step': 126},\n",
              "  {'loss': 0.8102480173110962, 'step': 127},\n",
              "  {'loss': 0.7473270893096924, 'step': 128},\n",
              "  {'loss': 0.4925592839717865, 'step': 129},\n",
              "  {'loss': 0.3734370470046997, 'step': 130},\n",
              "  {'loss': 0.4019835293292999, 'step': 131},\n",
              "  {'loss': 0.5715944766998291, 'step': 132},\n",
              "  {'loss': 0.7370476722717285, 'step': 133},\n",
              "  {'loss': 0.8084611296653748, 'step': 134},\n",
              "  {'loss': 0.27219873666763306, 'step': 135},\n",
              "  {'loss': 0.9113802909851074, 'step': 136},\n",
              "  {'loss': 0.2676466703414917, 'step': 137},\n",
              "  {'loss': 0.560991108417511, 'step': 138},\n",
              "  {'loss': 1.064115285873413, 'step': 139},\n",
              "  {'loss': 0.3245326280593872, 'step': 140},\n",
              "  {'loss': 0.8436397314071655, 'step': 141},\n",
              "  {'loss': 1.2091341018676758, 'step': 142},\n",
              "  {'loss': 0.4543924331665039, 'step': 143},\n",
              "  {'loss': 0.26438218355178833, 'step': 144},\n",
              "  {'loss': 0.3979231119155884, 'step': 145},\n",
              "  {'loss': 0.37817084789276123, 'step': 146},\n",
              "  {'loss': 0.9272872805595398, 'step': 147},\n",
              "  {'loss': 0.37104332447052, 'step': 148},\n",
              "  {'loss': 0.6496032476425171, 'step': 149},\n",
              "  {'loss': 0.5087558627128601, 'step': 150},\n",
              "  {'loss': 0.6274682283401489, 'step': 151},\n",
              "  {'loss': 0.13523612916469574, 'step': 152},\n",
              "  {'loss': 0.9013052582740784, 'step': 153},\n",
              "  {'loss': 0.37151408195495605, 'step': 154},\n",
              "  {'loss': 0.569506049156189, 'step': 155},\n",
              "  {'loss': 0.3807920217514038, 'step': 156},\n",
              "  {'loss': 1.2756001949310303, 'step': 157},\n",
              "  {'loss': 0.3187456727027893, 'step': 158},\n",
              "  {'loss': 0.24805891513824463, 'step': 159},\n",
              "  {'loss': 0.5341911315917969, 'step': 160},\n",
              "  {'loss': 1.2077462673187256, 'step': 161},\n",
              "  {'loss': 0.4002837538719177, 'step': 162},\n",
              "  {'loss': 0.8964220285415649, 'step': 163},\n",
              "  {'loss': 0.1689465045928955, 'step': 164},\n",
              "  {'loss': 0.673452615737915, 'step': 165},\n",
              "  {'loss': 0.2696675658226013, 'step': 166},\n",
              "  {'loss': 0.9555773735046387, 'step': 167},\n",
              "  {'loss': 0.6343585848808289, 'step': 168},\n",
              "  {'loss': 0.24548089504241943, 'step': 169},\n",
              "  {'loss': 1.0791606903076172, 'step': 170},\n",
              "  {'loss': 0.5466651320457458, 'step': 171},\n",
              "  {'loss': 0.3475998640060425, 'step': 172},\n",
              "  {'loss': 0.8143138885498047, 'step': 173},\n",
              "  {'loss': 0.8173468112945557, 'step': 174},\n",
              "  {'loss': 0.7277711033821106, 'step': 175},\n",
              "  {'loss': 0.9666836261749268, 'step': 176},\n",
              "  {'loss': 1.0186108350753784, 'step': 177},\n",
              "  {'loss': 0.2964683771133423, 'step': 178},\n",
              "  {'loss': 0.36613696813583374, 'step': 179},\n",
              "  {'loss': 0.7213021516799927, 'step': 180},\n",
              "  {'loss': 0.3068872392177582, 'step': 181},\n",
              "  {'loss': 0.6754522323608398, 'step': 182},\n",
              "  {'loss': 1.0082287788391113, 'step': 183},\n",
              "  {'loss': 0.6015515923500061, 'step': 184},\n",
              "  {'loss': 0.5110335946083069, 'step': 185},\n",
              "  {'loss': 1.1667025089263916, 'step': 186},\n",
              "  {'loss': 0.32849037647247314, 'step': 187},\n",
              "  {'loss': 1.2775671482086182, 'step': 188},\n",
              "  {'loss': 0.7325879335403442, 'step': 189},\n",
              "  {'loss': 0.29322248697280884, 'step': 190},\n",
              "  {'loss': 0.5871511697769165, 'step': 191},\n",
              "  {'loss': 0.6226872205734253, 'step': 192},\n",
              "  {'loss': 1.4002041816711426, 'step': 193},\n",
              "  {'loss': 0.69505774974823, 'step': 194},\n",
              "  {'loss': 0.310889333486557, 'step': 195},\n",
              "  {'loss': 0.3986448347568512, 'step': 196},\n",
              "  {'loss': 1.2312395572662354, 'step': 197},\n",
              "  {'loss': 0.40968701243400574, 'step': 198},\n",
              "  {'loss': 0.7797766327857971, 'step': 199},\n",
              "  {'loss': 0.644957423210144, 'step': 200},\n",
              "  {'loss': 0.951555073261261, 'step': 201},\n",
              "  {'loss': 0.626651406288147, 'step': 202},\n",
              "  {'loss': 0.32950329780578613, 'step': 203},\n",
              "  {'loss': 0.5791168212890625, 'step': 204},\n",
              "  {'loss': 0.7374627590179443, 'step': 205},\n",
              "  {'loss': 0.32260584831237793, 'step': 206},\n",
              "  {'loss': 0.1601136475801468, 'step': 207},\n",
              "  {'loss': 0.7786506414413452, 'step': 208},\n",
              "  {'loss': 0.2537432014942169, 'step': 209},\n",
              "  {'loss': 0.5890710353851318, 'step': 210},\n",
              "  {'loss': 0.7456731796264648, 'step': 211},\n",
              "  {'loss': 0.30154430866241455, 'step': 212},\n",
              "  {'loss': 0.3987278342247009, 'step': 213},\n",
              "  {'loss': 0.307807981967926, 'step': 214},\n",
              "  {'loss': 0.9228541254997253, 'step': 215},\n",
              "  {'loss': 0.2485066056251526, 'step': 216},\n",
              "  {'loss': 0.6654583215713501, 'step': 217},\n",
              "  {'loss': 0.21347546577453613, 'step': 218},\n",
              "  {'loss': 1.1917641162872314, 'step': 219},\n",
              "  {'loss': 0.8841887712478638, 'step': 220},\n",
              "  {'loss': 1.8126733303070068, 'step': 221},\n",
              "  {'loss': 0.4044328033924103, 'step': 222},\n",
              "  {'loss': 0.4505789279937744, 'step': 223},\n",
              "  {'loss': 0.4376268684864044, 'step': 224},\n",
              "  {'loss': 0.7223089933395386, 'step': 225},\n",
              "  {'loss': 0.49964702129364014, 'step': 226},\n",
              "  {'loss': 1.0080941915512085, 'step': 227},\n",
              "  {'loss': 0.97428297996521, 'step': 228},\n",
              "  {'loss': 0.26324620842933655, 'step': 229},\n",
              "  {'loss': 0.814405083656311, 'step': 230},\n",
              "  {'loss': 0.366900771856308, 'step': 231},\n",
              "  {'loss': 0.6833156943321228, 'step': 232},\n",
              "  {'loss': 0.7381766438484192, 'step': 233},\n",
              "  {'loss': 0.981475830078125, 'step': 234},\n",
              "  {'loss': 0.42298710346221924, 'step': 235},\n",
              "  {'loss': 0.44481101632118225, 'step': 236},\n",
              "  {'loss': 0.25783050060272217, 'step': 237},\n",
              "  {'loss': 0.45984262228012085, 'step': 238},\n",
              "  {'loss': 0.2762202322483063, 'step': 239},\n",
              "  {'loss': 0.6045504808425903, 'step': 240},\n",
              "  {'loss': 1.1793582439422607, 'step': 241},\n",
              "  {'loss': 0.8168516159057617, 'step': 242},\n",
              "  {'loss': 0.3617470860481262, 'step': 243},\n",
              "  {'loss': 0.25376075506210327, 'step': 244},\n",
              "  {'loss': 1.660738468170166, 'step': 245},\n",
              "  {'loss': 0.9269342422485352, 'step': 246},\n",
              "  {'loss': 0.33806443214416504, 'step': 247},\n",
              "  {'loss': 0.4272269606590271, 'step': 248},\n",
              "  {'loss': 0.9492217898368835, 'step': 249},\n",
              "  {'loss': 0.34198126196861267, 'step': 250},\n",
              "  {'loss': 0.39705944061279297, 'step': 251},\n",
              "  {'loss': 1.3820383548736572, 'step': 252},\n",
              "  {'loss': 1.1110975742340088, 'step': 253},\n",
              "  {'loss': 0.4630424976348877, 'step': 254},\n",
              "  {'loss': 0.9472167491912842, 'step': 255},\n",
              "  {'loss': 0.36264050006866455, 'step': 256},\n",
              "  {'loss': 0.4234926998615265, 'step': 257},\n",
              "  {'loss': 0.2366953194141388, 'step': 258},\n",
              "  {'loss': 0.8512541651725769, 'step': 259},\n",
              "  {'loss': 0.6722626090049744, 'step': 260},\n",
              "  {'loss': 0.6084244251251221, 'step': 261},\n",
              "  {'loss': 0.6288711428642273, 'step': 262},\n",
              "  {'loss': 0.2420380413532257, 'step': 263},\n",
              "  {'loss': 0.4051637649536133, 'step': 264},\n",
              "  {'loss': 0.5873522758483887, 'step': 265},\n",
              "  {'loss': 0.8453085422515869, 'step': 266},\n",
              "  {'loss': 0.4999864101409912, 'step': 267},\n",
              "  {'loss': 0.4954622983932495, 'step': 268},\n",
              "  {'loss': 0.6299115419387817, 'step': 269},\n",
              "  {'loss': 0.6681607365608215, 'step': 270},\n",
              "  {'loss': 0.628259539604187, 'step': 271},\n",
              "  {'loss': 0.2153947651386261, 'step': 272},\n",
              "  {'loss': 0.36594659090042114, 'step': 273},\n",
              "  {'loss': 0.49828484654426575, 'step': 274},\n",
              "  {'loss': 0.46272820234298706, 'step': 275},\n",
              "  {'loss': 0.7241920828819275, 'step': 276},\n",
              "  {'loss': 0.1924874186515808, 'step': 277},\n",
              "  {'loss': 0.29556983709335327, 'step': 278},\n",
              "  {'loss': 1.4152776002883911, 'step': 279},\n",
              "  {'loss': 0.9767541289329529, 'step': 280},\n",
              "  {'loss': 0.8812788128852844, 'step': 281},\n",
              "  {'loss': 0.6057726144790649, 'step': 282},\n",
              "  {'loss': 1.0924395322799683, 'step': 283},\n",
              "  {'loss': 0.4273146390914917, 'step': 284},\n",
              "  {'loss': 0.5460953712463379, 'step': 285},\n",
              "  {'loss': 0.31929680705070496, 'step': 286},\n",
              "  {'loss': 0.9690501689910889, 'step': 287},\n",
              "  {'loss': 0.2738500237464905, 'step': 288},\n",
              "  {'loss': 0.5392227172851562, 'step': 289},\n",
              "  {'loss': 0.5785156488418579, 'step': 290},\n",
              "  {'loss': 0.16190126538276672, 'step': 291},\n",
              "  {'loss': 0.4507765769958496, 'step': 292},\n",
              "  {'loss': 0.7105478048324585, 'step': 293},\n",
              "  {'loss': 0.7829238176345825, 'step': 294},\n",
              "  {'loss': 0.7451438903808594, 'step': 295},\n",
              "  {'loss': 0.4197458028793335, 'step': 296},\n",
              "  {'loss': 0.4940831661224365, 'step': 297},\n",
              "  {'loss': 0.1889045238494873, 'step': 298},\n",
              "  {'loss': 0.13004282116889954, 'step': 299},\n",
              "  {'loss': 0.36531591415405273, 'step': 300},\n",
              "  {'loss': 1.0733673572540283, 'step': 301},\n",
              "  {'loss': 0.17068125307559967, 'step': 302},\n",
              "  {'loss': 0.9052812457084656, 'step': 303},\n",
              "  {'loss': 0.43203049898147583, 'step': 304},\n",
              "  {'loss': 0.4002986550331116, 'step': 305},\n",
              "  {'loss': 0.19623591005802155, 'step': 306},\n",
              "  {'loss': 0.4687400758266449, 'step': 307},\n",
              "  {'loss': 0.2846123278141022, 'step': 308},\n",
              "  {'loss': 0.559532642364502, 'step': 309},\n",
              "  {'loss': 0.7110905647277832, 'step': 310},\n",
              "  {'loss': 0.38947752118110657, 'step': 311},\n",
              "  {'loss': 2.1851236820220947, 'step': 312},\n",
              "  {'loss': 0.3158678114414215, 'step': 313},\n",
              "  {'loss': 0.7667191028594971, 'step': 314},\n",
              "  {'loss': 0.4228196144104004, 'step': 315},\n",
              "  {'loss': 1.0775823593139648, 'step': 316},\n",
              "  {'loss': 0.28700000047683716, 'step': 317},\n",
              "  {'loss': 0.9204263091087341, 'step': 318},\n",
              "  {'loss': 0.3156816363334656, 'step': 319},\n",
              "  {'loss': 0.8485198616981506, 'step': 320},\n",
              "  {'loss': 0.8680766820907593, 'step': 321},\n",
              "  {'loss': 0.38350531458854675, 'step': 322},\n",
              "  {'loss': 0.478094220161438, 'step': 323},\n",
              "  {'loss': 0.29867857694625854, 'step': 324},\n",
              "  {'loss': 0.4192007780075073, 'step': 325},\n",
              "  {'loss': 0.47119730710983276, 'step': 326},\n",
              "  {'loss': 0.4969821870326996, 'step': 327},\n",
              "  {'loss': 0.28314346075057983, 'step': 328},\n",
              "  {'loss': 0.6943255662918091, 'step': 329},\n",
              "  {'loss': 0.22291123867034912, 'step': 330},\n",
              "  {'loss': 0.49558743834495544, 'step': 331},\n",
              "  {'loss': 1.5701985359191895, 'step': 332},\n",
              "  {'loss': 0.2929949164390564, 'step': 333},\n",
              "  {'loss': 0.4465698301792145, 'step': 334},\n",
              "  {'loss': 0.33501285314559937, 'step': 335},\n",
              "  {'loss': 0.7312928438186646, 'step': 336},\n",
              "  {'loss': 1.1179652214050293, 'step': 337},\n",
              "  {'loss': 0.8249649405479431, 'step': 338},\n",
              "  {'loss': 0.888394832611084, 'step': 339},\n",
              "  {'loss': 0.2859644293785095, 'step': 340},\n",
              "  {'loss': 0.3887918293476105, 'step': 341},\n",
              "  {'loss': 0.3280220329761505, 'step': 342},\n",
              "  {'loss': 0.21460339426994324, 'step': 343},\n",
              "  {'loss': 0.44819557666778564, 'step': 344},\n",
              "  {'loss': 0.132786825299263, 'step': 345},\n",
              "  {'loss': 0.46521276235580444, 'step': 346},\n",
              "  {'loss': 0.3812088370323181, 'step': 347},\n",
              "  {'loss': 1.0961146354675293, 'step': 348},\n",
              "  {'loss': 0.5510651469230652, 'step': 349},\n",
              "  {'loss': 0.35987526178359985, 'step': 350},\n",
              "  {'loss': 0.5534579753875732, 'step': 351},\n",
              "  {'loss': 1.0616658926010132, 'step': 352},\n",
              "  {'loss': 0.34559276700019836, 'step': 353},\n",
              "  {'loss': 0.3144508898258209, 'step': 354},\n",
              "  {'loss': 0.2728310525417328, 'step': 355},\n",
              "  {'loss': 0.4279384911060333, 'step': 356},\n",
              "  {'loss': 0.44860267639160156, 'step': 357},\n",
              "  {'loss': 0.8072901964187622, 'step': 358},\n",
              "  {'loss': 0.18525168299674988, 'step': 359},\n",
              "  {'loss': 0.5820379257202148, 'step': 360},\n",
              "  {'loss': 0.4208161234855652, 'step': 361},\n",
              "  {'loss': 0.4279400408267975, 'step': 362},\n",
              "  {'loss': 0.34657615423202515, 'step': 363},\n",
              "  {'loss': 0.734642744064331, 'step': 364},\n",
              "  {'loss': 0.3165869414806366, 'step': 365},\n",
              "  {'loss': 0.3604312241077423, 'step': 366},\n",
              "  {'loss': 0.3800414204597473, 'step': 367},\n",
              "  {'loss': 0.9893914461135864, 'step': 368},\n",
              "  {'loss': 0.4600810706615448, 'step': 369},\n",
              "  {'loss': 1.2593039274215698, 'step': 370},\n",
              "  {'loss': 0.6663172245025635, 'step': 371},\n",
              "  {'loss': 0.29480427503585815, 'step': 372},\n",
              "  {'loss': 0.48024022579193115, 'step': 373},\n",
              "  {'loss': 0.6682171821594238, 'step': 374},\n",
              "  {'loss': 0.832463264465332, 'step': 375},\n",
              "  {'loss': 1.4044021368026733, 'step': 376},\n",
              "  {'loss': 0.5633590221405029, 'step': 377},\n",
              "  {'loss': 0.33036625385284424, 'step': 378},\n",
              "  {'loss': 0.27406102418899536, 'step': 379},\n",
              "  {'loss': 0.7505893111228943, 'step': 380},\n",
              "  {'loss': 0.6834690570831299, 'step': 381},\n",
              "  {'loss': 0.35841459035873413, 'step': 382},\n",
              "  {'loss': 0.5424566864967346, 'step': 383},\n",
              "  {'loss': 0.8164031505584717, 'step': 384},\n",
              "  {'loss': 0.43932339549064636, 'step': 385},\n",
              "  {'loss': 0.9144889116287231, 'step': 386},\n",
              "  {'loss': 0.11685651540756226, 'step': 387},\n",
              "  {'loss': 0.2718353271484375, 'step': 388},\n",
              "  {'loss': 0.4171551465988159, 'step': 389},\n",
              "  {'loss': 0.2997675836086273, 'step': 390},\n",
              "  {'loss': 0.25780972838401794, 'step': 391},\n",
              "  {'loss': 0.4589000940322876, 'step': 392},\n",
              "  {'loss': 0.8176366090774536, 'step': 393},\n",
              "  {'loss': 0.9509485363960266, 'step': 394},\n",
              "  {'loss': 0.806929349899292, 'step': 395},\n",
              "  {'loss': 0.18373152613639832, 'step': 396},\n",
              "  {'loss': 0.20429186522960663, 'step': 397},\n",
              "  {'loss': 0.33084404468536377, 'step': 398},\n",
              "  {'loss': 0.514585018157959, 'step': 399},\n",
              "  {'loss': 0.19410553574562073, 'step': 400},\n",
              "  {'loss': 0.6291276812553406, 'step': 401},\n",
              "  {'loss': 0.43398338556289673, 'step': 402},\n",
              "  {'loss': 0.4198801815509796, 'step': 403},\n",
              "  {'loss': 1.016858458518982, 'step': 404},\n",
              "  {'loss': 0.323149174451828, 'step': 405},\n",
              "  {'loss': 0.3863893747329712, 'step': 406},\n",
              "  {'loss': 0.973143994808197, 'step': 407},\n",
              "  {'loss': 0.5683209896087646, 'step': 408},\n",
              "  {'loss': 0.4126078486442566, 'step': 409},\n",
              "  {'loss': 0.7006435394287109, 'step': 410},\n",
              "  {'loss': 0.23827338218688965, 'step': 411},\n",
              "  {'loss': 1.032018780708313, 'step': 412},\n",
              "  {'loss': 0.42453324794769287, 'step': 413},\n",
              "  {'loss': 0.22600023448467255, 'step': 414},\n",
              "  {'loss': 0.7047280669212341, 'step': 415},\n",
              "  {'loss': 0.2913091480731964, 'step': 416},\n",
              "  {'loss': 0.7712206840515137, 'step': 417},\n",
              "  {'loss': 0.5337510108947754, 'step': 418},\n",
              "  {'loss': 0.5296875238418579, 'step': 419},\n",
              "  {'loss': 0.33166149258613586, 'step': 420},\n",
              "  {'loss': 0.17889249324798584, 'step': 421},\n",
              "  {'loss': 0.22080492973327637, 'step': 422},\n",
              "  {'loss': 0.519688606262207, 'step': 423},\n",
              "  {'loss': 0.539940357208252, 'step': 424},\n",
              "  {'loss': 0.4187723398208618, 'step': 425},\n",
              "  {'loss': 0.6960372924804688, 'step': 426},\n",
              "  {'loss': 0.9068428874015808, 'step': 427},\n",
              "  {'loss': 0.5633466243743896, 'step': 428},\n",
              "  {'loss': 0.539186954498291, 'step': 429},\n",
              "  {'loss': 0.3316173255443573, 'step': 430},\n",
              "  {'loss': 1.4965429306030273, 'step': 431},\n",
              "  {'loss': 0.3537064790725708, 'step': 432},\n",
              "  {'loss': 0.4436812996864319, 'step': 433},\n",
              "  {'loss': 1.0290838479995728, 'step': 434},\n",
              "  {'loss': 0.31721365451812744, 'step': 435},\n",
              "  {'loss': 0.5733942985534668, 'step': 436},\n",
              "  {'loss': 0.5772886276245117, 'step': 437},\n",
              "  {'loss': 0.6295042037963867, 'step': 438},\n",
              "  {'loss': 0.2430783063173294, 'step': 439},\n",
              "  {'loss': 0.44532865285873413, 'step': 440},\n",
              "  {'loss': 0.7803750038146973, 'step': 441},\n",
              "  {'loss': 0.18856345117092133, 'step': 442},\n",
              "  {'loss': 0.20847973227500916, 'step': 443},\n",
              "  {'loss': 0.2312012016773224, 'step': 444},\n",
              "  {'loss': 0.5612461566925049, 'step': 445},\n",
              "  {'loss': 0.43427398800849915, 'step': 446},\n",
              "  {'loss': 0.3894692659378052, 'step': 447},\n",
              "  {'loss': 0.24889883399009705, 'step': 448},\n",
              "  {'loss': 0.8983279466629028, 'step': 449},\n",
              "  {'loss': 0.17926988005638123, 'step': 450},\n",
              "  {'loss': 0.7609704732894897, 'step': 451},\n",
              "  {'loss': 0.6448001265525818, 'step': 452},\n",
              "  {'loss': 1.2252345085144043, 'step': 453},\n",
              "  {'loss': 0.2398461401462555, 'step': 454},\n",
              "  {'loss': 0.29911693930625916, 'step': 455},\n",
              "  {'loss': 0.278970867395401, 'step': 456},\n",
              "  {'loss': 0.40142011642456055, 'step': 457},\n",
              "  {'loss': 0.44263768196105957, 'step': 458},\n",
              "  {'loss': 0.578292965888977, 'step': 459},\n",
              "  {'loss': 0.40544572472572327, 'step': 460},\n",
              "  {'loss': 0.15933874249458313, 'step': 461},\n",
              "  {'loss': 0.36051464080810547, 'step': 462},\n",
              "  {'loss': 0.3410356640815735, 'step': 463},\n",
              "  {'loss': 0.46616920828819275, 'step': 464},\n",
              "  {'loss': 0.3598913848400116, 'step': 465},\n",
              "  {'loss': 0.2091880589723587, 'step': 466},\n",
              "  {'loss': 0.6344746351242065, 'step': 467},\n",
              "  {'loss': 0.5444972515106201, 'step': 468},\n",
              "  {'loss': 0.22855058312416077, 'step': 469},\n",
              "  {'loss': 0.23509983718395233, 'step': 470},\n",
              "  {'loss': 0.9946080446243286, 'step': 471},\n",
              "  {'loss': 0.23503845930099487, 'step': 472},\n",
              "  {'loss': 0.39869171380996704, 'step': 473},\n",
              "  {'loss': 0.2796630859375, 'step': 474},\n",
              "  {'loss': 0.4775705337524414, 'step': 475},\n",
              "  {'loss': 1.1405484676361084, 'step': 476},\n",
              "  {'loss': 1.0588349103927612, 'step': 477},\n",
              "  {'loss': 1.072588324546814, 'step': 478},\n",
              "  {'loss': 0.20017307996749878, 'step': 479},\n",
              "  {'loss': 0.4510924816131592, 'step': 480},\n",
              "  {'loss': 0.8193923234939575, 'step': 481},\n",
              "  {'loss': 0.7240849733352661, 'step': 482},\n",
              "  {'loss': 0.22673164308071136, 'step': 483},\n",
              "  {'loss': 0.3658496141433716, 'step': 484},\n",
              "  {'loss': 0.42346757650375366, 'step': 485},\n",
              "  {'loss': 0.9445099234580994, 'step': 486},\n",
              "  {'loss': 0.3238261342048645, 'step': 487},\n",
              "  {'loss': 0.6643178462982178, 'step': 488},\n",
              "  {'loss': 0.6156987547874451, 'step': 489},\n",
              "  {'loss': 0.3841426372528076, 'step': 490},\n",
              "  {'loss': 0.4426805377006531, 'step': 491},\n",
              "  {'loss': 0.5029352307319641, 'step': 492},\n",
              "  {'loss': 0.14448873698711395, 'step': 493},\n",
              "  {'loss': 0.35306352376937866, 'step': 494},\n",
              "  {'loss': 0.6866660118103027, 'step': 495},\n",
              "  {'loss': 0.4878278076648712, 'step': 496},\n",
              "  {'loss': 0.4150119423866272, 'step': 497},\n",
              "  {'loss': 0.16856913268566132, 'step': 498},\n",
              "  {'loss': 0.6679744720458984, 'step': 499},\n",
              "  {'loss': 0.25730475783348083, 'step': 500},\n",
              "  {'loss': 0.37980416417121887, 'step': 501},\n",
              "  {'loss': 0.44889336824417114, 'step': 502},\n",
              "  {'loss': 0.13131779432296753, 'step': 503},\n",
              "  {'loss': 0.2705419957637787, 'step': 504},\n",
              "  {'loss': 0.4369063079357147, 'step': 505},\n",
              "  {'loss': 0.2505365014076233, 'step': 506},\n",
              "  {'loss': 0.34162402153015137, 'step': 507},\n",
              "  {'loss': 0.1923048347234726, 'step': 508},\n",
              "  {'loss': 0.4159238934516907, 'step': 509},\n",
              "  {'loss': 0.30513107776641846, 'step': 510},\n",
              "  {'loss': 0.2957255244255066, 'step': 511},\n",
              "  {'loss': 0.6275211572647095, 'step': 512},\n",
              "  {'loss': 0.8870058059692383, 'step': 513},\n",
              "  {'loss': 0.2567655146121979, 'step': 514},\n",
              "  {'loss': 0.47253191471099854, 'step': 515},\n",
              "  {'loss': 0.4168813228607178, 'step': 516},\n",
              "  {'loss': 0.7175235152244568, 'step': 517},\n",
              "  {'loss': 0.2220619022846222, 'step': 518},\n",
              "  {'loss': 0.2924184203147888, 'step': 519},\n",
              "  {'loss': 0.3113390803337097, 'step': 520},\n",
              "  {'loss': 0.4525873064994812, 'step': 521},\n",
              "  {'loss': 0.6695735454559326, 'step': 522},\n",
              "  {'loss': 0.6257581114768982, 'step': 523},\n",
              "  {'loss': 0.6832529306411743, 'step': 524},\n",
              "  {'loss': 0.9818243384361267, 'step': 525},\n",
              "  {'loss': 0.29220154881477356, 'step': 526},\n",
              "  {'loss': 0.4124178886413574, 'step': 527},\n",
              "  {'loss': 0.4353640079498291, 'step': 528},\n",
              "  {'loss': 0.18086208403110504, 'step': 529},\n",
              "  {'loss': 0.4181410074234009, 'step': 530},\n",
              "  {'loss': 1.178230881690979, 'step': 531},\n",
              "  {'loss': 0.16470693051815033, 'step': 532},\n",
              "  {'loss': 0.4479600787162781, 'step': 533},\n",
              "  {'loss': 1.1459274291992188, 'step': 534},\n",
              "  {'loss': 0.27965056896209717, 'step': 535},\n",
              "  {'loss': 0.8612271547317505, 'step': 536},\n",
              "  {'loss': 0.154488205909729, 'step': 537},\n",
              "  {'loss': 0.7030806541442871, 'step': 538},\n",
              "  {'loss': 0.29547739028930664, 'step': 539},\n",
              "  {'loss': 1.18570077419281, 'step': 540},\n",
              "  {'loss': 0.2328275740146637, 'step': 541},\n",
              "  {'loss': 0.3927221894264221, 'step': 542},\n",
              "  {'loss': 0.4458203911781311, 'step': 543},\n",
              "  {'loss': 1.092276692390442, 'step': 544},\n",
              "  {'loss': 0.1974448710680008, 'step': 545},\n",
              "  {'loss': 0.27364328503608704, 'step': 546},\n",
              "  {'loss': 0.22519993782043457, 'step': 547},\n",
              "  {'loss': 0.6467697620391846, 'step': 548},\n",
              "  {'loss': 0.1402001529932022, 'step': 549},\n",
              "  {'loss': 0.8245280385017395, 'step': 550},\n",
              "  {'loss': 0.26600638031959534, 'step': 551},\n",
              "  {'loss': 0.34668081998825073, 'step': 552},\n",
              "  {'loss': 0.6031594276428223, 'step': 553},\n",
              "  {'loss': 0.7268639802932739, 'step': 554},\n",
              "  {'loss': 0.18767300248146057, 'step': 555},\n",
              "  {'loss': 0.2592756152153015, 'step': 556},\n",
              "  {'loss': 0.33596789836883545, 'step': 557},\n",
              "  {'loss': 0.23436206579208374, 'step': 558},\n",
              "  {'loss': 1.5647097826004028, 'step': 559},\n",
              "  {'loss': 0.6728905439376831, 'step': 560},\n",
              "  {'loss': 0.3965320587158203, 'step': 561},\n",
              "  {'loss': 0.5841513872146606, 'step': 562},\n",
              "  {'loss': 0.728096604347229, 'step': 563},\n",
              "  {'loss': 0.5390310287475586, 'step': 564},\n",
              "  {'loss': 1.064638376235962, 'step': 565},\n",
              "  {'loss': 0.49903303384780884, 'step': 566},\n",
              "  {'loss': 0.32880252599716187, 'step': 567},\n",
              "  {'loss': 0.46438121795654297, 'step': 568},\n",
              "  {'loss': 0.45296382904052734, 'step': 569},\n",
              "  {'loss': 0.459613561630249, 'step': 570},\n",
              "  {'loss': 0.7240512371063232, 'step': 571},\n",
              "  {'loss': 0.24834343791007996, 'step': 572},\n",
              "  {'loss': 0.4956325888633728, 'step': 573},\n",
              "  {'loss': 0.621715784072876, 'step': 574},\n",
              "  {'loss': 0.5435272455215454, 'step': 575},\n",
              "  {'loss': 0.6367270350456238, 'step': 576},\n",
              "  {'loss': 0.9033657312393188, 'step': 577},\n",
              "  {'loss': 0.23738078773021698, 'step': 578},\n",
              "  {'loss': 0.2754833996295929, 'step': 579},\n",
              "  {'loss': 0.6612449288368225, 'step': 580},\n",
              "  {'loss': 0.25804975628852844, 'step': 581},\n",
              "  {'loss': 0.560172975063324, 'step': 582},\n",
              "  {'loss': 0.308653861284256, 'step': 583},\n",
              "  {'loss': 0.16088725626468658, 'step': 584},\n",
              "  {'loss': 0.37179237604141235, 'step': 585},\n",
              "  {'loss': 0.508387565612793, 'step': 586},\n",
              "  {'loss': 0.44759678840637207, 'step': 587},\n",
              "  {'loss': 0.22656014561653137, 'step': 588},\n",
              "  {'loss': 1.3581629991531372, 'step': 589},\n",
              "  {'loss': 0.2826564311981201, 'step': 590},\n",
              "  {'loss': 0.6443076133728027, 'step': 591},\n",
              "  {'loss': 0.38340502977371216, 'step': 592},\n",
              "  {'loss': 0.516974925994873, 'step': 593},\n",
              "  {'loss': 0.26064538955688477, 'step': 594},\n",
              "  {'loss': 0.8472734689712524, 'step': 595},\n",
              "  {'loss': 1.0108680725097656, 'step': 596},\n",
              "  {'loss': 0.4854292869567871, 'step': 597},\n",
              "  {'loss': 0.24901267886161804, 'step': 598},\n",
              "  {'loss': 0.4658496081829071, 'step': 599},\n",
              "  {'loss': 0.3326660394668579, 'step': 600},\n",
              "  {'loss': 1.245396375656128, 'step': 601},\n",
              "  {'loss': 0.273047536611557, 'step': 602},\n",
              "  {'loss': 0.44567227363586426, 'step': 603},\n",
              "  {'loss': 0.3974505364894867, 'step': 604},\n",
              "  {'loss': 0.27819526195526123, 'step': 605},\n",
              "  {'loss': 1.0162086486816406, 'step': 606},\n",
              "  {'loss': 0.41390877962112427, 'step': 607},\n",
              "  {'loss': 0.4721684455871582, 'step': 608},\n",
              "  {'loss': 1.213913917541504, 'step': 609},\n",
              "  {'loss': 1.503424882888794, 'step': 610},\n",
              "  {'loss': 0.3559345006942749, 'step': 611},\n",
              "  {'loss': 0.3069400191307068, 'step': 612},\n",
              "  {'loss': 1.3784244060516357, 'step': 613},\n",
              "  {'loss': 0.5778298377990723, 'step': 614},\n",
              "  {'loss': 0.1194770410656929, 'step': 615},\n",
              "  {'loss': 0.5525256991386414, 'step': 616},\n",
              "  {'loss': 0.5601643323898315, 'step': 617},\n",
              "  {'loss': 0.6769167184829712, 'step': 618},\n",
              "  {'loss': 0.31650808453559875, 'step': 619},\n",
              "  {'loss': 0.34260720014572144, 'step': 620},\n",
              "  {'loss': 0.7332805395126343, 'step': 621},\n",
              "  {'loss': 0.21332719922065735, 'step': 622},\n",
              "  {'loss': 0.4794868528842926, 'step': 623},\n",
              "  {'loss': 0.3575095236301422, 'step': 624},\n",
              "  {'loss': 0.6970219612121582, 'step': 625},\n",
              "  {'loss': 0.5015566349029541, 'step': 626},\n",
              "  {'loss': 0.4166288375854492, 'step': 627},\n",
              "  {'loss': 1.2495613098144531, 'step': 628},\n",
              "  {'loss': 0.7575193643569946, 'step': 629},\n",
              "  {'loss': 0.3386167585849762, 'step': 630},\n",
              "  {'loss': 0.5200424194335938, 'step': 631},\n",
              "  {'loss': 0.4956183433532715, 'step': 632},\n",
              "  {'loss': 0.278457373380661, 'step': 633},\n",
              "  {'loss': 0.1576366424560547, 'step': 634},\n",
              "  {'loss': 0.426151841878891, 'step': 635},\n",
              "  {'loss': 0.23418396711349487, 'step': 636},\n",
              "  {'loss': 0.4901507496833801, 'step': 637},\n",
              "  {'loss': 0.39355024695396423, 'step': 638},\n",
              "  {'loss': 0.3660469651222229, 'step': 639},\n",
              "  {'loss': 0.6087504029273987, 'step': 640},\n",
              "  {'loss': 0.6485060453414917, 'step': 641},\n",
              "  {'loss': 0.6456125974655151, 'step': 642},\n",
              "  {'loss': 0.2929513156414032, 'step': 643},\n",
              "  {'loss': 0.3372802138328552, 'step': 644},\n",
              "  {'loss': 0.934712290763855, 'step': 645},\n",
              "  {'loss': 0.7090182304382324, 'step': 646},\n",
              "  {'loss': 0.3241364061832428, 'step': 647},\n",
              "  {'loss': 0.1433929204940796, 'step': 648},\n",
              "  {'loss': 2.2503066062927246, 'step': 649},\n",
              "  {'loss': 0.7835860252380371, 'step': 650},\n",
              "  {'loss': 0.3420724868774414, 'step': 651},\n",
              "  {'loss': 0.5023424625396729, 'step': 652},\n",
              "  {'loss': 0.36533501744270325, 'step': 653},\n",
              "  {'loss': 0.41002097725868225, 'step': 654},\n",
              "  {'loss': 0.8799501061439514, 'step': 655},\n",
              "  {'loss': 0.5046977996826172, 'step': 656},\n",
              "  {'loss': 0.3302288055419922, 'step': 657},\n",
              "  {'loss': 0.28479263186454773, 'step': 658},\n",
              "  {'loss': 0.2966541051864624, 'step': 659},\n",
              "  {'loss': 0.7378203868865967, 'step': 660},\n",
              "  {'loss': 0.7885100841522217, 'step': 661},\n",
              "  {'loss': 0.22069379687309265, 'step': 662},\n",
              "  {'loss': 0.7080762982368469, 'step': 663},\n",
              "  {'loss': 0.32876062393188477, 'step': 664},\n",
              "  {'loss': 0.4205983877182007, 'step': 665},\n",
              "  {'loss': 15.481622695922852, 'step': 666},\n",
              "  {'loss': 0.49645906686782837, 'step': 667},\n",
              "  {'loss': 0.7193015813827515, 'step': 668},\n",
              "  {'loss': 0.8039680123329163, 'step': 669},\n",
              "  {'loss': 0.2989093065261841, 'step': 670},\n",
              "  {'loss': 0.9265555143356323, 'step': 671},\n",
              "  {'loss': 0.8809409737586975, 'step': 672},\n",
              "  {'loss': 0.6296960115432739, 'step': 673},\n",
              "  {'loss': 0.9231283068656921, 'step': 674},\n",
              "  {'loss': 0.8827511668205261, 'step': 675},\n",
              "  {'loss': 0.5296546816825867, 'step': 676},\n",
              "  {'loss': 0.9642626047134399, 'step': 677},\n",
              "  {'loss': 1.748740553855896, 'step': 678},\n",
              "  {'loss': 1.4934613704681396, 'step': 679},\n",
              "  {'loss': 1.8828363418579102, 'step': 680},\n",
              "  {'loss': 0.6190611124038696, 'step': 681},\n",
              "  {'loss': 0.7661861181259155, 'step': 682},\n",
              "  {'loss': 1.5739800930023193, 'step': 683},\n",
              "  {'loss': 0.7589809894561768, 'step': 684},\n",
              "  {'loss': 0.17308825254440308, 'step': 685},\n",
              "  {'loss': 0.3146279454231262, 'step': 686},\n",
              "  {'loss': 0.5361226797103882, 'step': 687},\n",
              "  {'loss': 0.709139883518219, 'step': 688},\n",
              "  {'loss': 0.4243081212043762, 'step': 689},\n",
              "  {'loss': 0.3890937864780426, 'step': 690},\n",
              "  {'loss': 0.5724981427192688, 'step': 691},\n",
              "  {'loss': 0.4345569610595703, 'step': 692},\n",
              "  {'loss': 0.33667245507240295, 'step': 693},\n",
              "  {'loss': 0.40259307622909546, 'step': 694},\n",
              "  {'loss': 0.442551851272583, 'step': 695},\n",
              "  {'loss': 0.6022542119026184, 'step': 696},\n",
              "  {'loss': 0.5469453930854797, 'step': 697},\n",
              "  {'loss': 0.48857569694519043, 'step': 698},\n",
              "  {'loss': 0.4884375333786011, 'step': 699},\n",
              "  {'loss': 0.5353483557701111, 'step': 700},\n",
              "  {'loss': 0.6698664426803589, 'step': 701},\n",
              "  {'loss': 1.0814179182052612, 'step': 702},\n",
              "  {'loss': 0.3677104115486145, 'step': 703},\n",
              "  {'loss': 0.4472447633743286, 'step': 704},\n",
              "  {'loss': 0.20378336310386658, 'step': 705},\n",
              "  {'loss': 0.3452538847923279, 'step': 706},\n",
              "  {'loss': 0.4392397701740265, 'step': 707},\n",
              "  {'loss': 0.4982036054134369, 'step': 708},\n",
              "  {'loss': 0.3149777948856354, 'step': 709},\n",
              "  {'loss': 0.6815004944801331, 'step': 710},\n",
              "  {'loss': 0.46814823150634766, 'step': 711},\n",
              "  {'loss': 0.49225738644599915, 'step': 712},\n",
              "  {'loss': 0.20177727937698364, 'step': 713},\n",
              "  {'loss': 0.6381688714027405, 'step': 714},\n",
              "  {'loss': 0.6998788118362427, 'step': 715},\n",
              "  {'loss': 0.37314891815185547, 'step': 716},\n",
              "  {'loss': 0.8144955635070801, 'step': 717},\n",
              "  {'loss': 0.3467046916484833, 'step': 718},\n",
              "  {'loss': 0.3851594924926758, 'step': 719},\n",
              "  {'loss': 0.5582188367843628, 'step': 720},\n",
              "  {'loss': 0.4106213450431824, 'step': 721},\n",
              "  {'loss': 0.48952749371528625, 'step': 722},\n",
              "  {'loss': 0.2506186366081238, 'step': 723},\n",
              "  {'loss': 0.46036773920059204, 'step': 724},\n",
              "  {'loss': 0.8562783598899841, 'step': 725},\n",
              "  {'loss': 0.08810929954051971, 'step': 726},\n",
              "  {'loss': 0.5774583220481873, 'step': 727},\n",
              "  {'loss': 0.08615928888320923, 'step': 728},\n",
              "  {'loss': 0.8372136950492859, 'step': 729},\n",
              "  {'loss': 0.3392470180988312, 'step': 730},\n",
              "  {'loss': 0.5335842967033386, 'step': 731},\n",
              "  {'loss': 0.5489998459815979, 'step': 732},\n",
              "  {'loss': 0.09846165776252747, 'step': 733},\n",
              "  {'loss': 0.1854204535484314, 'step': 734},\n",
              "  {'loss': 0.5679256916046143, 'step': 735},\n",
              "  {'loss': 0.3793630301952362, 'step': 736},\n",
              "  {'loss': 0.45391929149627686, 'step': 737},\n",
              "  {'loss': 0.33006444573402405, 'step': 738},\n",
              "  {'loss': 0.7601843476295471, 'step': 739},\n",
              "  {'loss': 0.3189522624015808, 'step': 740},\n",
              "  {'loss': 0.31347647309303284, 'step': 741},\n",
              "  {'loss': 0.2082791030406952, 'step': 742},\n",
              "  {'loss': 0.7643767595291138, 'step': 743},\n",
              "  {'loss': 0.42412269115448, 'step': 744},\n",
              "  {'loss': 0.3521985709667206, 'step': 745},\n",
              "  {'loss': 0.09502923488616943, 'step': 746},\n",
              "  {'loss': 0.4957755506038666, 'step': 747},\n",
              "  {'loss': 0.22812038660049438, 'step': 748},\n",
              "  {'loss': 0.5112192034721375, 'step': 749},\n",
              "  {'loss': 0.49478280544281006, 'step': 750},\n",
              "  {'loss': 0.6876542568206787, 'step': 751},\n",
              "  {'loss': 0.20467445254325867, 'step': 752},\n",
              "  {'loss': 0.6517897248268127, 'step': 753},\n",
              "  {'loss': 0.2916327714920044, 'step': 754},\n",
              "  {'loss': 0.2072056531906128, 'step': 755},\n",
              "  {'loss': 0.2660538852214813, 'step': 756},\n",
              "  {'loss': 0.841073215007782, 'step': 757},\n",
              "  {'loss': 0.18844212591648102, 'step': 758},\n",
              "  {'loss': 0.6326728463172913, 'step': 759},\n",
              "  {'loss': 0.9298363924026489, 'step': 760},\n",
              "  {'loss': 0.25695592164993286, 'step': 761},\n",
              "  {'loss': 0.3139192461967468, 'step': 762},\n",
              "  {'loss': 0.23293088376522064, 'step': 763},\n",
              "  {'loss': 0.40553098917007446, 'step': 764},\n",
              "  {'loss': 0.32387834787368774, 'step': 765},\n",
              "  {'loss': 0.1810360550880432, 'step': 766},\n",
              "  {'loss': 0.6064671874046326, 'step': 767},\n",
              "  {'loss': 0.19556573033332825, 'step': 768},\n",
              "  {'loss': 0.9224231839179993, 'step': 769},\n",
              "  {'loss': 0.6142680048942566, 'step': 770},\n",
              "  {'loss': 0.3088274598121643, 'step': 771},\n",
              "  {'loss': 0.16760438680648804, 'step': 772},\n",
              "  {'loss': 0.15520241856575012, 'step': 773},\n",
              "  {'loss': 0.18692827224731445, 'step': 774},\n",
              "  {'loss': 0.3789028227329254, 'step': 775},\n",
              "  {'loss': 0.6402091979980469, 'step': 776},\n",
              "  {'loss': 0.45218002796173096, 'step': 777},\n",
              "  {'loss': 0.20898446440696716, 'step': 778},\n",
              "  {'loss': 0.3665864169597626, 'step': 779},\n",
              "  {'loss': 0.26502302289009094, 'step': 780},\n",
              "  {'loss': 0.3672827482223511, 'step': 781},\n",
              "  {'loss': 0.2977941334247589, 'step': 782},\n",
              "  {'loss': 0.4667850732803345, 'step': 783},\n",
              "  {'loss': 0.4317854046821594, 'step': 784},\n",
              "  {'loss': 0.813524603843689, 'step': 785},\n",
              "  {'loss': 0.28886353969573975, 'step': 786},\n",
              "  {'loss': 0.26850050687789917, 'step': 787},\n",
              "  {'loss': 0.3256891965866089, 'step': 788},\n",
              "  {'loss': 0.21018743515014648, 'step': 789},\n",
              "  {'loss': 0.8072388172149658, 'step': 790},\n",
              "  {'loss': 0.09799705445766449, 'step': 791},\n",
              "  {'loss': 0.5114266276359558, 'step': 792},\n",
              "  {'loss': 0.5151758790016174, 'step': 793},\n",
              "  {'loss': 0.4181440770626068, 'step': 794},\n",
              "  {'loss': 1.2282025814056396, 'step': 795},\n",
              "  {'loss': 0.42981016635894775, 'step': 796},\n",
              "  {'loss': 0.12435037642717361, 'step': 797},\n",
              "  {'loss': 0.2130538821220398, 'step': 798},\n",
              "  {'loss': 0.3907189667224884, 'step': 799},\n",
              "  {'loss': 0.30395743250846863, 'step': 800},\n",
              "  {'loss': 0.3338805139064789, 'step': 801},\n",
              "  {'loss': 0.4489535689353943, 'step': 802},\n",
              "  {'loss': 0.2822447121143341, 'step': 803},\n",
              "  {'loss': 0.3341827988624573, 'step': 804},\n",
              "  {'loss': 0.19107210636138916, 'step': 805},\n",
              "  {'loss': 0.49922919273376465, 'step': 806},\n",
              "  {'loss': 0.590279221534729, 'step': 807},\n",
              "  {'loss': 0.44360071420669556, 'step': 808},\n",
              "  {'loss': 0.49327951669692993, 'step': 809},\n",
              "  {'loss': 0.40746182203292847, 'step': 810},\n",
              "  {'loss': 0.2993656396865845, 'step': 811},\n",
              "  {'loss': 0.7464003562927246, 'step': 812},\n",
              "  {'loss': 0.40373480319976807, 'step': 813},\n",
              "  {'loss': 0.8591351509094238, 'step': 814},\n",
              "  {'loss': 0.5376942157745361, 'step': 815},\n",
              "  {'loss': 0.2966862618923187, 'step': 816},\n",
              "  {'loss': 0.8449231386184692, 'step': 817},\n",
              "  {'loss': 0.9977790117263794, 'step': 818},\n",
              "  {'loss': 0.20060008764266968, 'step': 819},\n",
              "  {'loss': 0.25553733110427856, 'step': 820},\n",
              "  {'loss': 0.15987029671669006, 'step': 821},\n",
              "  {'loss': 0.44624078273773193, 'step': 822},\n",
              "  {'loss': 0.19689810276031494, 'step': 823},\n",
              "  {'loss': 0.44310659170150757, 'step': 824},\n",
              "  {'loss': 0.6578441858291626, 'step': 825},\n",
              "  {'loss': 0.496317058801651, 'step': 826},\n",
              "  {'loss': 0.419691264629364, 'step': 827},\n",
              "  {'loss': 0.773036003112793, 'step': 828},\n",
              "  {'loss': 0.2727183699607849, 'step': 829},\n",
              "  {'loss': 0.41567155718803406, 'step': 830},\n",
              "  {'loss': 0.10847871005535126, 'step': 831},\n",
              "  {'loss': 0.17382296919822693, 'step': 832},\n",
              "  {'loss': 0.2786913514137268, 'step': 833},\n",
              "  {'loss': 0.2766013741493225, 'step': 834},\n",
              "  {'loss': 1.2112282514572144, 'step': 835},\n",
              "  {'loss': 0.46473199129104614, 'step': 836},\n",
              "  {'loss': 0.2228921353816986, 'step': 837},\n",
              "  {'loss': 0.26960188150405884, 'step': 838},\n",
              "  {'loss': 0.2267686128616333, 'step': 839},\n",
              "  {'loss': 0.5200842022895813, 'step': 840},\n",
              "  {'loss': 0.8918099999427795, 'step': 841},\n",
              "  {'loss': 0.5389776825904846, 'step': 842},\n",
              "  {'loss': 0.369053453207016, 'step': 843},\n",
              "  {'loss': 0.11530512571334839, 'step': 844},\n",
              "  {'loss': 3.2610092163085938, 'step': 845},\n",
              "  {'loss': 0.13372096419334412, 'step': 846},\n",
              "  {'loss': 0.555644154548645, 'step': 847},\n",
              "  {'loss': 0.3308390974998474, 'step': 848},\n",
              "  {'loss': 0.16545642912387848, 'step': 849},\n",
              "  {'loss': 1.289936900138855, 'step': 850},\n",
              "  {'loss': 0.7183440327644348, 'step': 851},\n",
              "  {'loss': 0.4005129039287567, 'step': 852},\n",
              "  {'loss': 0.2072264850139618, 'step': 853},\n",
              "  {'loss': 0.30901896953582764, 'step': 854},\n",
              "  {'loss': 0.37055703997612, 'step': 855},\n",
              "  {'loss': 0.24610617756843567, 'step': 856},\n",
              "  {'loss': 0.9134435653686523, 'step': 857},\n",
              "  {'loss': 0.24924124777317047, 'step': 858},\n",
              "  {'loss': 0.20818862318992615, 'step': 859},\n",
              "  {'loss': 0.30870679020881653, 'step': 860},\n",
              "  {'loss': 0.5547442436218262, 'step': 861},\n",
              "  {'loss': 0.3949589729309082, 'step': 862},\n",
              "  {'loss': 0.540919303894043, 'step': 863},\n",
              "  {'loss': 0.22632159292697906, 'step': 864},\n",
              "  {'loss': 0.40565037727355957, 'step': 865},\n",
              "  {'loss': 0.39770960807800293, 'step': 866},\n",
              "  {'loss': 0.5679086446762085, 'step': 867},\n",
              "  {'loss': 0.7734276056289673, 'step': 868},\n",
              "  {'loss': 0.3746422529220581, 'step': 869},\n",
              "  {'loss': 0.13017433881759644, 'step': 870},\n",
              "  {'loss': 0.4053346812725067, 'step': 871},\n",
              "  {'loss': 0.45319169759750366, 'step': 872},\n",
              "  {'loss': 0.33212804794311523, 'step': 873},\n",
              "  {'loss': 0.11247937381267548, 'step': 874},\n",
              "  {'loss': 0.37466150522232056, 'step': 875},\n",
              "  {'loss': 0.6286007165908813, 'step': 876},\n",
              "  {'loss': 0.37011563777923584, 'step': 877},\n",
              "  {'loss': 0.2789478600025177, 'step': 878},\n",
              "  {'loss': 0.37127378582954407, 'step': 879},\n",
              "  {'loss': 0.21208012104034424, 'step': 880},\n",
              "  {'loss': 0.22222992777824402, 'step': 881},\n",
              "  {'loss': 0.3459041714668274, 'step': 882},\n",
              "  {'loss': 0.4957599341869354, 'step': 883},\n",
              "  {'loss': 0.2349470853805542, 'step': 884},\n",
              "  {'loss': 0.7996510863304138, 'step': 885},\n",
              "  {'loss': 0.3180673122406006, 'step': 886},\n",
              "  {'loss': 0.3825390338897705, 'step': 887},\n",
              "  {'loss': 0.6171979904174805, 'step': 888},\n",
              "  {'loss': 0.3252444565296173, 'step': 889},\n",
              "  {'loss': 4.4120330810546875, 'step': 890},\n",
              "  {'loss': 0.2955668866634369, 'step': 891},\n",
              "  {'loss': 0.584546685218811, 'step': 892},\n",
              "  {'loss': 0.26980096101760864, 'step': 893},\n",
              "  {'loss': 0.2536892592906952, 'step': 894},\n",
              "  {'loss': 0.34149301052093506, 'step': 895},\n",
              "  {'loss': 0.28666016459465027, 'step': 896},\n",
              "  {'loss': 0.7262892723083496, 'step': 897},\n",
              "  {'loss': 0.3893381357192993, 'step': 898},\n",
              "  {'loss': 0.5783944129943848, 'step': 899},\n",
              "  {'loss': 0.2970973253250122, 'step': 900},\n",
              "  {'loss': 0.21873944997787476, 'step': 901},\n",
              "  {'loss': 0.16503474116325378, 'step': 902},\n",
              "  {'loss': 0.630186915397644, 'step': 903},\n",
              "  {'loss': 0.2980622351169586, 'step': 904},\n",
              "  {'loss': 0.43371036648750305, 'step': 905},\n",
              "  {'loss': 0.5591743588447571, 'step': 906},\n",
              "  {'loss': 0.7492885589599609, 'step': 907},\n",
              "  {'loss': 0.7585203051567078, 'step': 908},\n",
              "  {'loss': 0.14284665882587433, 'step': 909},\n",
              "  {'loss': 0.6465857028961182, 'step': 910},\n",
              "  {'loss': 0.34641674160957336, 'step': 911},\n",
              "  {'loss': 0.29452744126319885, 'step': 912},\n",
              "  {'loss': 0.23477527499198914, 'step': 913},\n",
              "  {'loss': 0.13124041259288788, 'step': 914},\n",
              "  {'loss': 0.25912290811538696, 'step': 915},\n",
              "  {'loss': 0.40788763761520386, 'step': 916},\n",
              "  {'loss': 0.226737380027771, 'step': 917},\n",
              "  {'loss': 0.15350782871246338, 'step': 918},\n",
              "  {'loss': 0.3277057409286499, 'step': 919},\n",
              "  {'loss': 0.14319883286952972, 'step': 920},\n",
              "  {'loss': 0.2941327393054962, 'step': 921},\n",
              "  {'loss': 0.5185866951942444, 'step': 922},\n",
              "  {'loss': 0.3430662751197815, 'step': 923},\n",
              "  {'loss': 0.22102166712284088, 'step': 924},\n",
              "  {'loss': 0.5940433740615845, 'step': 925},\n",
              "  {'loss': 0.17039546370506287, 'step': 926},\n",
              "  {'loss': 0.5562324523925781, 'step': 927},\n",
              "  {'loss': 0.19942978024482727, 'step': 928},\n",
              "  {'loss': 0.4888911843299866, 'step': 929},\n",
              "  {'loss': 207.44619750976562, 'step': 930},\n",
              "  {'loss': 0.2529219686985016, 'step': 931},\n",
              "  {'loss': 0.8650034666061401, 'step': 932},\n",
              "  {'loss': 1.1202547550201416, 'step': 933},\n",
              "  {'loss': 1.6464643478393555, 'step': 934},\n",
              "  {'loss': 2.2930750846862793, 'step': 935},\n",
              "  {'loss': 1.7041237354278564, 'step': 936},\n",
              "  {'loss': 2.5791401863098145, 'step': 937},\n",
              "  {'loss': 9.838727951049805, 'step': 938},\n",
              "  {'loss': 2.792689085006714, 'step': 939},\n",
              "  {'loss': 2.8098948001861572, 'step': 940},\n",
              "  {'loss': 2.8898229598999023, 'step': 941},\n",
              "  {'loss': 2.719414234161377, 'step': 942},\n",
              "  {'loss': 3.039822578430176, 'step': 943},\n",
              "  {'loss': 4.221978187561035, 'step': 944},\n",
              "  {'loss': 3.2280805110931396, 'step': 945},\n",
              "  {'loss': 5.815399169921875, 'step': 946},\n",
              "  {'loss': 1.163910150527954, 'step': 947},\n",
              "  {'loss': 1.75787353515625, 'step': 948},\n",
              "  {'loss': 0.5009660124778748, 'step': 949},\n",
              "  {'loss': 0.6290950775146484, 'step': 950},\n",
              "  {'loss': 1.6280977725982666, 'step': 951},\n",
              "  {'loss': 0.9073656797409058, 'step': 952},\n",
              "  {'loss': 1.4528807401657104, 'step': 953},\n",
              "  {'loss': 0.5764523148536682, 'step': 954},\n",
              "  {'loss': 0.4974205791950226, 'step': 955},\n",
              "  {'loss': 0.34560486674308777, 'step': 956},\n",
              "  {'loss': 0.4807855188846588, 'step': 957},\n",
              "  {'loss': 0.694940984249115, 'step': 958},\n",
              "  {'loss': 0.8486573696136475, 'step': 959},\n",
              "  {'loss': 1.145668387413025, 'step': 960},\n",
              "  {'loss': 0.9702374339103699, 'step': 961},\n",
              "  {'loss': 0.7030003666877747, 'step': 962},\n",
              "  {'loss': 1.495974063873291, 'step': 963},\n",
              "  {'loss': 0.8762715458869934, 'step': 964},\n",
              "  {'loss': 1.4637160301208496, 'step': 965},\n",
              "  {'loss': 0.6960806250572205, 'step': 966},\n",
              "  {'loss': 0.5626314878463745, 'step': 967},\n",
              "  {'loss': 1.0346026420593262, 'step': 968},\n",
              "  {'loss': 0.2980450391769409, 'step': 969},\n",
              "  {'loss': 1.0510071516036987, 'step': 970},\n",
              "  {'loss': 0.5386040806770325, 'step': 971},\n",
              "  {'loss': 0.5183713436126709, 'step': 972},\n",
              "  {'loss': 0.5231544375419617, 'step': 973},\n",
              "  {'loss': 0.6490055918693542, 'step': 974},\n",
              "  {'loss': 0.6801120638847351, 'step': 975},\n",
              "  {'loss': 0.24206992983818054, 'step': 976},\n",
              "  {'loss': 0.309140682220459, 'step': 977},\n",
              "  {'loss': 0.2873383164405823, 'step': 978},\n",
              "  {'loss': 0.3006506562232971, 'step': 979},\n",
              "  {'loss': 0.49001336097717285, 'step': 980},\n",
              "  {'loss': 0.7524440288543701, 'step': 981},\n",
              "  {'loss': 1.285766363143921, 'step': 982},\n",
              "  {'loss': 0.2546428442001343, 'step': 983},\n",
              "  {'loss': 0.4041273593902588, 'step': 984},\n",
              "  {'loss': 0.4067184627056122, 'step': 985},\n",
              "  {'loss': 0.5598932504653931, 'step': 986},\n",
              "  {'loss': 0.5646632313728333, 'step': 987},\n",
              "  {'loss': 0.8401783108711243, 'step': 988},\n",
              "  {'loss': 0.31843581795692444, 'step': 989},\n",
              "  {'loss': 0.5182589292526245, 'step': 990},\n",
              "  {'loss': 0.3517382740974426, 'step': 991},\n",
              "  {'loss': 0.3525104522705078, 'step': 992},\n",
              "  {'loss': 0.775708019733429, 'step': 993},\n",
              "  {'loss': 0.419442743062973, 'step': 994},\n",
              "  {'loss': 0.4921400547027588, 'step': 995},\n",
              "  {'loss': 0.3718472421169281, 'step': 996},\n",
              "  {'loss': 0.6362888813018799, 'step': 997},\n",
              "  {'loss': 0.2926481366157532, 'step': 998},\n",
              "  {'loss': 0.47040581703186035, 'step': 999},\n",
              "  ...],\n",
              " 'val': [{'loss': 6.89718808319943, 'step': 0},\n",
              "  {'loss': 0.7459876263929792, 'step': 726},\n",
              "  {'loss': 0.413214286342879, 'step': 1452},\n",
              "  {'loss': 0.4007845998487689, 'step': 2178},\n",
              "  {'loss': 0.3984327171582821, 'step': 2904},\n",
              "  {'loss': 0.38579549283281833, 'step': 3630},\n",
              "  {'loss': 0.3743085315189332, 'step': 4356},\n",
              "  {'loss': 0.3661357736569052, 'step': 5082},\n",
              "  {'loss': 0.36853063959351257, 'step': 5808},\n",
              "  {'loss': 0.38051842334718744, 'step': 6534},\n",
              "  {'loss': 0.3641542158097275, 'step': 7260},\n",
              "  {'loss': 0.36061456097551614, 'step': 7986},\n",
              "  {'loss': 0.4070362394198406, 'step': 8712},\n",
              "  {'loss': 0.3615043402518615, 'step': 9438},\n",
              "  {'loss': 0.35864728701508736, 'step': 10164},\n",
              "  {'loss': 0.3671721331467313, 'step': 10890},\n",
              "  {'loss': 0.36342443070135827, 'step': 11616},\n",
              "  {'loss': 0.5164871111758484, 'step': 12342},\n",
              "  {'loss': 0.3623668119496058, 'step': 13068},\n",
              "  {'loss': 0.3653572277466128, 'step': 13794},\n",
              "  {'loss': 0.3509169342842969, 'step': 14520},\n",
              "  {'loss': 0.34870327910608495, 'step': 15246},\n",
              "  {'loss': 0.34722512164576486, 'step': 15972},\n",
              "  {'loss': 0.35172486882502874, 'step': 16698},\n",
              "  {'loss': 0.34414468510153373, 'step': 17424},\n",
              "  {'loss': 0.3412474229747106, 'step': 18150},\n",
              "  {'loss': 0.3369506055966389, 'step': 18876},\n",
              "  {'loss': 0.34872120295551196, 'step': 19602},\n",
              "  {'loss': 0.3589213285287303, 'step': 20328},\n",
              "  {'loss': 0.3476207917017385, 'step': 21054},\n",
              "  {'loss': 0.33554454532659744, 'step': 21780},\n",
              "  {'loss': 0.3369234150875945, 'step': 22506},\n",
              "  {'loss': 0.3334583424278035, 'step': 23232},\n",
              "  {'loss': 0.33755279597172066, 'step': 23958},\n",
              "  {'loss': 0.33264398153040037, 'step': 24684},\n",
              "  {'loss': 0.3285573882566503, 'step': 25410},\n",
              "  {'loss': 0.3285897145093965, 'step': 26136},\n",
              "  {'loss': 0.3258831600758655, 'step': 26862},\n",
              "  {'loss': 0.3270117129114541, 'step': 27588},\n",
              "  {'loss': 0.33071212736843536, 'step': 28314},\n",
              "  {'loss': 0.3286090234587015, 'step': 29040},\n",
              "  {'loss': 0.3338533839257049, 'step': 29766},\n",
              "  {'loss': 0.32538402514639964, 'step': 30492},\n",
              "  {'loss': 0.3339868274725173, 'step': 31218},\n",
              "  {'loss': 0.32298889188172897, 'step': 31944},\n",
              "  {'loss': 0.33545853894912014, 'step': 32670},\n",
              "  {'loss': 0.3380809096881181, 'step': 33396},\n",
              "  {'loss': 0.3236725109606242, 'step': 34122},\n",
              "  {'loss': 0.32678108382200405, 'step': 34848},\n",
              "  {'loss': 0.3209333520013192, 'step': 35574},\n",
              "  {'loss': 0.319774587261529, 'step': 36300},\n",
              "  {'loss': 0.32876490960128546, 'step': 37026},\n",
              "  {'loss': 0.3227020504399518, 'step': 37752},\n",
              "  {'loss': 0.3207132261831406, 'step': 38478},\n",
              "  {'loss': 0.3264590632786189, 'step': 39204},\n",
              "  {'loss': 0.3226950930908692, 'step': 39930},\n",
              "  {'loss': 0.3225202383704422, 'step': 40656},\n",
              "  {'loss': 0.3203707497782451, 'step': 41382},\n",
              "  {'loss': 0.3253177064971244, 'step': 42108},\n",
              "  {'loss': 0.3163242027440593, 'step': 42834},\n",
              "  {'loss': 0.32962884265960246, 'step': 43560},\n",
              "  {'loss': 0.3144307318489906, 'step': 44286},\n",
              "  {'loss': 0.3177608738322396, 'step': 45012},\n",
              "  {'loss': 0.32075816947073976, 'step': 45738},\n",
              "  {'loss': 0.3254235623604503, 'step': 46464},\n",
              "  {'loss': 0.31915254792398656, 'step': 47190},\n",
              "  {'loss': 0.31926342952719405, 'step': 47916},\n",
              "  {'loss': 0.3178659526954505, 'step': 48642},\n",
              "  {'loss': 0.3234617699953643, 'step': 49368},\n",
              "  {'loss': 0.32383581252445365, 'step': 50094},\n",
              "  {'loss': 0.3241923701726208, 'step': 50820},\n",
              "  {'loss': 0.3159385364779756, 'step': 51546}]}"
            ]
          },
          "metadata": {},
          "execution_count": 17
        }
      ],
      "source": [
        "record"
      ],
      "metadata": {
        "id": "2gDqixN7hlNE",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "5b8178c6-5749-498a-c3f3-5b302ee29fc3"
      }
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T06:47:16.396438Z",
          "start_time": "2025-01-16T06:47:16.283630Z"
        },
        "id": "kvGiYGPEhlNE",
        "outputId": "ef6d5036-890e-4b71-c25b-e7b4aeb9f154",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 449
        }
      },
      "source": [
        "#画线要注意的是损失是不一定在零到1之间的\n",
        "def plot_learning_curves(record_dict, sample_step=500):\n",
        "    # build DataFrame\n",
        "    train_df = pd.DataFrame(record_dict[\"train\"]).set_index(\"step\").iloc[::sample_step]\n",
        "    val_df = pd.DataFrame(record_dict[\"val\"]).set_index(\"step\")\n",
        "\n",
        "    # plot\n",
        "    for idx, item in enumerate(train_df.columns):\n",
        "        plt.plot(train_df.index, train_df[item], label=f\"train_{item}\")\n",
        "        plt.plot(val_df.index, val_df[item], label=f\"val_{item}\")\n",
        "        plt.grid()\n",
        "        plt.legend()\n",
        "        # plt.xticks(range(0, train_df.index[-1], 10*sample_step), range(0, train_df.index[-1], 10*sample_step))\n",
        "        plt.xlabel(\"step\")\n",
        "\n",
        "        plt.show()\n",
        "\n",
        "plot_learning_curves(record)  #横坐标是 steps"
      ],
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 640x480 with 1 Axes>"
            ],
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhYAAAGwCAYAAAD16iy9AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAdDNJREFUeJzt3Xd4VFX+P/D3nZpMkklIpyTU0APSpYhKFQUVXUVEV2yrK7isrK76WwvoKq7u+tW177qLFbGirCASeu+9hQ4JhFTSk6nn98ede5NJgSRMCZf363nyQGZuZs6cSWbec87nnCsJIQSIiIiIfEAX7AYQERGRdjBYEBERkc8wWBAREZHPMFgQERGRzzBYEBERkc8wWBAREZHPMFgQERGRzxgCfYdutxtnz55FREQEJEkK9N0TERFREwghUFJSglatWkGnq39cIuDB4uzZs0hKSgr03RIREZEPZGRkoE2bNvVeH/BgERERAUBumNVq9dntOhwOLF26FGPGjIHRaPTZ7ZKM/es/7Fv/Yv/6D/vWv5pb/xYXFyMpKUl9H69PwIOFMv1htVp9HiwsFgusVmuzeAK0hv3rP+xb/2L/+g/71r+aa/9erIyBxZtERETkMwwWRERE5DMMFkREROQzAa+xICIi7XG73bDb7cFuhqY4HA4YDAZUVlbC5XL5/f6MRiP0ev0l3w6DBRERXRK73Y7MzEy43e5gN0VThBBITExERkZGwPZ9ioqKQmJi4iXdH4MFERFdkpycHOj1eiQlJV1w4yRqHLfbjdLSUoSHh/u9X4UQKC8vR05ODgCgZcuWTb4tBgsiImoynU6HiooKtG7dGhaLJdjN0RRleikkJCQggS00NBSAHBTj4+ObPC3CaElERE2mvOGZTKYgt4R8QQmHDoejybfBYEFERJeM537SBl88jwwWRERE5DMMFkREROQzDBZERESXoF27dnjrrbd8clurVq2CJEkoLCz0ye0Fg2ZWhZwrrkR+JWB3utGMztVCRETN0HXXXYerrrrKJ4Fg69atCAsLu/RGaYRmgsWt729CfpkBA4aUITXJHOzmEBHRZUwIAZfLBYPh4m+TcXFxAWjR5UMzUyEGnVzJ6nKLILeEiOjKJYRAud0ZlC8hGvb6P3XqVKxevRpvv/02JEmCJEn45JNPIEkSfvnlF/Tr1w9msxnr1q3DsWPHcMsttyAhIQHh4eEYMGAAli1b5nV7NadCJEnCxx9/jIkTJ8JisSAlJQULFy5scp9+//336NGjB8xmM9q1a4d//OMfXte///77SElJQUhICBISEvCb3/xGve67775DamoqQkNDERMTg1GjRqGsrKzJbWkIzYxY6BgsiIiCrsLhQvcXfg3KfR94aSwspou/rb399ts4fPgwevbsiZdeegkAsH//fgDAM888g7///e/o0KEDWrRogYyMDNx444145ZVXYDab8dlnn2HChAlIT09HcnJyvfcxe/ZsvP7663jjjTfwzjvvYMqUKTh16hSio6Mb9Zh27dqFu+66C7NmzcKkSZOwYcMGPPbYY4iJicHUqVOxbds2/OEPf8Dnn3+OIUOGoKCgAGvXrgUAZGVlYfLkyXj99dcxceJElJSUYO3atQ0OYE2lmWChV4KFnzuMiIgub5GRkTCZTLBYLEhMTAQAHDp0CADw0ksvYfTo0eqx0dHR6N27t/r9yy+/jAULFmDhwoWYPn16vfcxdepUTJ48GQDw6quv4p///Ce2bNmCG264oVFtfe+99zBixAg8//zzAIDOnTvjwIEDeOONNzB16lScPn0aYWFhGD9+PCIiItC2bVv06dMHgBwsnE4nbrvtNrRt2xYAkJqa2qj7bwrtBAuJIxZERMEWatTjwEtjg3bfl6p///5e35eWlmLWrFlYtGiR+kZdUVGB06dPX/B2evXqpf4/LCwMVqtVPQ9HYxw+fBgTJ070umzo0KF466234HK5MHr0aLRt2xYdOnTADTfcgBtuuEGdgunduzdGjhyJ1NRUjB07FmPGjMFvfvMbtGjRotHtaAzN1FjoPY+EwYKIKHgkSYLFZAjKly92jay5uuPJJ5/EggUL8Oqrr2Lt2rXYtWsXUlNTL3qKeGON5YmSJPnl7K8RERHYsWMHvvrqK7Rs2RIvvPACevfujcLCQuj1eqSlpeGXX35B9+7d8c4776BLly44ceKEz9tRnYaChfwL5eZUCBERXYTJZILL5brocevXr8fUqVMxceJEpKamIjExESdPnvR/Az06d+6M9evX12pT586d1ZOEGQwGjBo1Cq+//jr27NmDkydPYsWKFQDkQDN06FDMnj0bO3fuhMlkwoIFC/zaZs1NhTg5YkFERBfRrl07bN68GSdPnkR4eHi9owkpKSn44YcfMGHCBEiShOeff94v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7RNfffWVCA0NFR999JF6zPr164Verxevv/66OHDggHjuueeE0WgUe/fu9Xsf+MvYsWPF3Llzxb59+8SuXbvEjTfeKJKTk0Vpaal6zKOPPiqSkpLE8uXLxbZt28TVV18thgwZol7vdDpFz549xahRo8TOnTvF4sWLRWxsrHj22WfVY44fPy4sFouYOXOmOHDggHjnnXeEXq8XS5YsUY/R4u/+woULxaJFi8Thw4dFenq6+H//7/8Jo9Eo9u3bJ4Rg3/rKli1bRLt27USvXr3EjBkz1MvZv0334osvih49eoisrCz1Kzc3V73+SulbTQSLgQMHimnTpqnfu1wu0apVKzFnzpwgtqr5qBks3G63SExMFG+88YZ6WWFhoTCbzeKrr74SQghx4MABAUBs3bpVPeaXX34RkiSJM2fOCCGEeP/990WLFi2EzWZTj3n66adFly5d1O/vvPNOcdNNN3m1Z9CgQeKRRx7x6WMMppycHAFArF69Wggh96XRaBTffvuteszBgwcFALFx40YhhBz8dDqdOHfunHrMBx98IKxWq9qff/7zn0WPHj287mvSpEli7Nix6vdXyu9+ixYtxMcff8y+9ZGSkhKRkpIi0tLSxLXXXqsGC/bvpXnxxRdF796967zuSurby34qxG63Y/v27Rg1apR6mU6nw6hRo7Bx48Ygtqz5OnHiBM6dO+fVZ5GRkRg0aJDaZxs3bkRUVBT69++vHjNq1CjodDps3rxZPWb48OEwmUzqMWPHjkV6ejrOnz+vHlP9fpRjtPTcFBUVAQCio6MBANu3b4fD4fB63F27dkVycrJX/6ampiIhIUE9ZuzYsSguLsb+/fvVYy7Ud1fC777L5cL8+fNRVlaGwYMHs299ZNq0abjppptq9QH799IdOXIErVq1QocOHTBlyhScPn0awJXVt5d9sMjLy4PL5fJ6IgAgISEB586dC1KrmjelXy7UZ+fOnUN8fLzX9QaDAdHR0V7H1HUb1e+jvmO08ty43W788Y9/xNChQ9GzZ08A8mM2mUyIioryOrZm/za174qLi1FRUaHp3/29e/ciPDwcZrMZjz76KBYsWIDu3buzb31g/vz52LFjB+bMmVPrOvbvpRk0aBA++eQTLFmyBB988AFOnDiBa665BiUlJVdU3wb87KZEWjJt2jTs27cP69atC3ZTNKVLly7YtWsXioqK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\n"
          },
          "metadata": {}
        }
      ],
      "execution_count": 18
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "t235wo3ChlNF"
      },
      "source": [
        "## 测试集"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T06:48:13.295991Z",
          "start_time": "2025-01-16T06:48:13.260417Z"
        },
        "id": "mX7nEsT4hlNF",
        "outputId": "147bf3f0-9d4b-4bd3-b35b-663433dcd257",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "source": [
        "model.eval()\n",
        "loss = evaluating(model, test_loader, loss_fct)\n",
        "print(f\"loss:     {loss:.4f}\")"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "loss:     0.3174\n"
          ]
        }
      ],
      "execution_count": 19
    },
    {
      "cell_type": "code",
      "source": [],
      "metadata": {
        "id": "lJYKiThU3A8C"
      },
      "execution_count": null,
      "outputs": []
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.10.8"
    },
    "orig_nbformat": 4,
    "colab": {
      "provenance": [],
      "gpuType": "T4"
    },
    "accelerator": "GPU",
    "widgets": {
      "application/vnd.jupyter.widget-state+json": {
        "1cc70e1e2cff4971b397d87c74111144": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HBoxModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HBoxView",
            "box_style": "",
            "children": [
              "IPY_MODEL_54992dbc580c478395276a5a774b7bd7",
              "IPY_MODEL_623f68e3b82c45f8a7d2d275800ad367",
              "IPY_MODEL_98c9febd679641419883ce41c938a7c3"
            ],
            "layout": "IPY_MODEL_982e7a263dc3402cb74a47490c922e67"
          }
        },
        "54992dbc580c478395276a5a774b7bd7": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HTMLModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HTMLView",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_8b045dadfe214a15a403959f80642177",
            "placeholder": "​",
            "style": "IPY_MODEL_1057d03ef04147ed81c8cd67ef6825d1",
            "value": " 71%"
          }
        },
        "623f68e3b82c45f8a7d2d275800ad367": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "FloatProgressModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "FloatProgressModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "ProgressView",
            "bar_style": "danger",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_77b2cc68843c4b9cbe8e7b0c011ae7f2",
            "max": 72600,
            "min": 0,
            "orientation": "horizontal",
            "style": "IPY_MODEL_53eb3bbbe39949cfaf3b4dfbd077fd3e",
            "value": 51546
          }
        },
        "98c9febd679641419883ce41c938a7c3": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HTMLModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HTMLView",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_3c5f86b891ea46d8b5b951fa64dd255a",
            "placeholder": "​",
            "style": "IPY_MODEL_6ed66a4d2e994f9281e2b51b0bd15554",
            "value": " 51546/72600 [03:53&lt;01:29, 235.18it/s, epoch=70]"
          }
        },
        "982e7a263dc3402cb74a47490c922e67": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "8b045dadfe214a15a403959f80642177": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "1057d03ef04147ed81c8cd67ef6825d1": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        },
        "77b2cc68843c4b9cbe8e7b0c011ae7f2": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "53eb3bbbe39949cfaf3b4dfbd077fd3e": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "ProgressStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "bar_color": null,
            "description_width": ""
          }
        },
        "3c5f86b891ea46d8b5b951fa64dd255a": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "6ed66a4d2e994f9281e2b51b0bd15554": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        }
      }
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}